我有一些数据“Foo”,我想从浏览器传递到服务器,并根据 foo 中包含的信息检索预测的统计信息。
$.ajax({
type: 'GET',
url: "/api/predictedStats/",
data: "foo=" + ko.toJSON(foo, fooProperties),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function(data) {
return _this.viewModel.setPredictedStats(data);
},
error: function(jqXHR, statusText, errorText) {
return _this.viewModel.setErrorValues(jqXHR, errorText);
}
});
我创建了一个预测的统计控制器,并获取了一个以 Foo 为参数的方法。
public class PredictedStatsController : ApiController
{
public PredictedStats Get(Foo foo)
{
return statsService.GetPredictedStats(foo);
}
}
在 Get 方法上设置断点,我看到 Foo 对象始终为空。仅以下几行的 webapi 跟踪记录没有引发错误。
WEBAPI: opr[FormatterParameterBinding] opn[ExecuteBindingAsync] msg[Binding parameter 'foo'] status[0]
WEBAPI: opr[JsonMediaTypeFormatter] opn[ReadFromStreamAsync] msg[Type='foo', content-type='application/json; charset=utf-8'] status[0]
WEBAPI: opr[JsonMediaTypeFormatter] opn[ReadFromStreamAsync] msg[Value read='null'] status[0]
我可以通过帖子将数据发送到 Foo 控制器以在服务器上创建 Foo 对象,所以我可以说创建的 json 客户端没有任何问题。
在 fiddler 中查看生成的 Get 如下所示,其中 jsondata 是对象 foo。
GET /api/predictedStats?foo={jsondata} HTTP/1.1
这甚至可能吗,还是我做错了?
谢谢尼尔
编辑:我觉得我几乎可以使用以下内容
public PredictedStats Get([FromUri]Foo foo)
{
return statsService.GetPredictedStats(foo);
}
对象 foo 恢复正常,但没有正确填充 Foo 的属性。
同时,我使用了具有几乎相同数据的 POST,只是删除了“foo =”,这工作得很好。
我不确定在这种情况下是否应该使用 POST 或 GET 但这会很有趣。
我还发现了这个http://bugs.jquery.com/ticket/8961这似乎表明您不能使用 jquery 将正文附加到 GET 请求,因此 POST 可能是唯一明智的选择