在开发真正的应用程序之前,我正在为Web Api项目做一个小问题测试。我实施了一些基本的GET
操作没有问题,但我对POST
请求有一些问题。
我正在使用jQuery调用POST
请求
var data = { name: "Pedro" };
$.post({
url: "http://localhost/Demo/api/user",
dataType: "json",
contentType: "application/json;charset=utf-8",
data: $.stringify("="+data),
success: function (data) {
alert(data[0].Name);
},
error: function () {
alert("error");
},
complete: function () {
alert("complete");
}
})
我的POST动作就像这样(在UserController.vb上)
Public Function PostUser(<FromBody()> ByVal name As String) As Demo.User.Model.User
Dim ids As Integer() = From userId In (From user In users Select user.Id)
Dim maxId As Integer = ids.Max + 1
Dim newUser As Demo.User.Model.User = New Demo.User.Model.User With {
.Id = maxId, _
.Mail = name & "@abc.com", _
.Name = name _
}
users(maxId) = newUser
Return newUser
End Function
使用上面的jQuery代码,我没有收到错误或异常消息,甚至没有达到它的动作。但是,如果我从代码隐藏(我通过Web表单项目实现Web Api)测试操作,则会调用该操作。以下是我从代码隐藏
进行测试的方法Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim client As New WebClient()
Dim data As New NameValueCollection()
data.Add("name", "Pedro")
Dim response As Byte() = client.UploadValues("http://localhost/Demo/api/user", "POST", data)
lbl.Text = Encoding.ASCII.GetString(response)
End Sub
所以,我的问题是,为什么我无法使用我的js代码访问网络Api操作?
因为你问,我使用$.stringify("="+data),
,因为我用this code扩展了jQuery,我已经这样做了,因为我需要支持旧版本的IE。
我还检查了this question,没有成功
更新:我已在Chrome上调试了该网站,并获得了404 error。出于某种原因,数据对象被发送为http://localhost/Demo/[object%20Object]
答案 0 :(得分:0)
我已经解决了我的问题,但仍然不太了解它。查看jQuery documentation,我发现data
来电中的$.post()
选项适用于GET
请求
data类型:PlainObject或String或Array要发送到的数据 服务器。如果不是字符串,它将转换为查询字符串。 已将其附加到GET请求的网址。请参阅processData选项 防止这种自动处理。对象必须是键/值对。如果 value是一个数组,jQuery使用相同的键序列化多个值 基于传统设置的价值(如下所述)。
所以我将代码更改为$.post()
调用的first option
var data = { Name: "Pedro", Mail: "peter@mail.com" };
$.post("http://localhost/Demo/api/user", data, function (d) { alert(d);}, "json")
这实际上解决了我的问题,但我对解决方案不太满意,因为正如jquery docs中所提到的,data
属性会根据方法调用改变它的行为,所以我觉得它应该像我以前一样好......如果任何人能澄清这将是很棒的:))