如何将JSON对象读取到WebAPI

本文关键字:读取 WebAPI 对象 JSON | 更新日期: 2023-09-27 18:24:11

我检查了一些类似的问题,但似乎没有一个答案适合(或者对我来说不够愚蠢)。所以,我有一个非常简单的WebAPI来检查DB中是否存在拥有电子邮件的用户。

AJAX:

var param = { "email": "ex.ample@email.com" };
$.ajax({
    url: "/api/User/",
    type: "GET",
    data: JSON.stringify(param),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        if (data == true) {
            // notify user that email exists
        }
        else {
            // not taken
        }             
    }                      
});

WebAPI:

public bool Get(UserResponse id)
{
    string email = id.email;
    UserStore<ApplicationUser> userStore = new UserStore<ApplicationUser>();
    ApplicationUserManager<ApplicationUser> manager = new ApplicationUserManager<ApplicationUser>(userStore);
    ApplicationUser user = manager.FindByEmail(email);
    if (user != null)
    {
        return true;
    }
    else
    {
        return false;
    }
}
//helper class:
public class UserResponse
{
    public string email { get; set; }
}

现在很明显,这是行不通的。ajax调用很好,但我如何将json对象解析为WebAPI,以便能够像id.email一样调用它
编辑
我无法将电子邮件地址作为字符串传递,因为逗号打乱了路由
ajax调用工作正常,对象被发送到WebAPI。问题是我无法在代码背后解析对象。

如何将JSON对象读取到WebAPI

问题:您当前的实现是作为GET请求的实体发送电子邮件。这是一个问题,因为GET请求不携带实体HTTP/1.1方法解决方案:将请求更改为POST

现在,因为您正在将电子邮件从您的客户端张贴到您的api,所以您必须将api实现更改为POST:

public bool Post(UserResponse id)

为了确保您发布的实体被正确绑定,您可以使用[FromBody],如:

public bool Post([FromBody] UserResponse id)

如果你这样做(并且你还没有覆盖默认的模型绑定器),你必须对你的模型进行注释,比如:

[DataContract]
public class UserResponse
{
    [DataMember]
    public string email { get; set; }
}

我认为这就是全部-希望它能起作用:)

将其更改为POST以通过请求主体发送您试图发送的对象,或者更改方法签名以接受电子邮件地址。

var param = { "email": "ex.ample@email.com" };
$.ajax({
    url: "/api/users/" + param.email,
    type: "GET",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        if (data == true) {
            // notify user that email exists
        }
        else {
            // not taken
        }             
    }                      
});
[HttpGet, Route("api/users/{emailaddress}")]
public bool Get(string emailaddress)
{
    string email = emailaddress;
    UserStore<ApplicationUser> userStore = new UserStore<ApplicationUser>();
    ApplicationUserManager<ApplicationUser> manager = new ApplicationUserManager<ApplicationUser>(userStore);
    ApplicationUser user = manager.FindByEmail(email);
    if (user != null)
    {
        return true;
    }
    else
    {
        return false;
    }
}
//helper class:
public class UserResponse
{
    public string email { get; set; }
}
var dto = {        
    Email: "ex.ample@email.com"
};
$.ajax({
    url: "/api/User/",
    type: "GET",
    data: dto,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        if (data == true) {
            // notify user that email exists
        }
        else {
            // not taken
        }             
    }                      
});

您可以在JavaScript:中创建一个对象

var myData= {
     Email: "me@email.com"
};

这将创建一个对象,与控制器所期望的对象相匹配。

然后设置Ajax调用,将其作为数据属性传递:

$.ajax({
    url: "/api/User/",
    type: "GET",
    data: myData,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        if (data == true) {
            // notify user that email exists
        }
        else {
            // not taken
        }             
    }                      
});

我喜欢这种方法,因为您可以根据需要添加更多属性。但是,如果您只传递电子邮件地址,则可能只需要传递一个字符串。