如何将复杂的模型从客户端传递到服务器
How to pass complex model from client to server?
我有一些数据"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的一个参数创建了一个预测统计控制器和get方法。
public class PredictedStatsController : ApiController
{
public PredictedStats Get(Foo foo)
{
return statsService.GetPredictedStats(foo);
}
}
在Get方法上粘贴断点,我看到Foo对象始终为null。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]
我可以通过post将数据发送到Foo控制器,在服务器上创建Foo对象,这样我就可以说json创建的客户端没有问题。
在fiddler中查找得到的Get如下所示,其中jsondata是对象foo。
GET /api/predictedStats?foo={jsondata} HTTP/1.1
这可能吗?还是我做错了?
谢谢Neil
编辑:我觉得我几乎通过以下完成了这项工作
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可能是唯一明智的选项
您几乎到达了那里:)
当您使用[FromUri]
(必须用于"复杂"对象,因为默认情况下Web API不"绑定"复杂对象,它总是从主体中反序列化它们)时,您不需要在Uri中传递param=
,只需将值的成员作为查询字符串参数传递。即'member1=value&member2=value'
-其中member1
和member2
是Foo
的成员。
请注意,jQuery中没有"bug"——虽然HTTP规范没有禁止请求体,但浏览器很可能会禁止(如果是这样,jQuery就无法发送),而且服务器很可能永远不会读取它。这是不可接受的做法。它在缓存方面也可能存在有趣的问题,因为浏览器不会缓存POST、PUT、DELETE等,但如果响应标头不禁止,则会缓存GET——这可能会对客户端应用程序产生严重的副作用。我建议您查看带有请求主体的SO:HTTPGET,以了解有关此主题的更多信息和一些有用的链接。
同样,当使用jQuery时——您也不需要将对象转换为JSON——只需在选项的data
成员中传递javascript对象,jQuery就会将其转换为正确的格式。
或者应该是这样,Web API理解jQuery将其传递为.
- 客户端服务器REST API captcha实现
- 如何防止在客户端/服务器两侧对文本框进行sql注入
- 最小化在javascript中客户端/服务器之间发送的数据
- 客户端服务器常量通信PHP
- 调试器在Meteor.call(可能是客户端/服务器调试)之后停止
- 是否有一种方法可以限制要上传到客户端服务器的文件大小
- 我可以只使用JavaScript制作客户端/服务器任务管理器吗
- 使用jQuery和MVC进行客户端-服务器搜索
- C/SSL/JQuery.ajax() 客户端 - >服务器连接重置,但发送了 1 个字节
- 用于客户端-服务器通信和安全的 API 密钥
- RESTful Web 应用程序中的客户端服务器体系结构
- 使用 node.js 进行客户端服务器通信
- 节点.js游戏开发,客户端-服务器数据交换逻辑
- 合并客户端/服务器端模板引擎
- 了解如何在javascript/HTML5/NodeJS中实现客户端-服务器-客户端基础结构
- 在客户端/服务器端检索原始电影大小
- 如何扩展 EJSON 以序列化 Meteor 客户端-服务器交互的 RegEx
- Javascript 服务器端事件与 C 客户端服务器程序
- 快速客户端服务器
- 在 NodeJS 中进行客户端-服务器通信的简单方法