如何将复杂的模型从客户端传递到服务器

How to pass complex model from client to server?

本文关键字:客户端 服务器 模型 复杂      更新时间:2024-06-27

我有一些数据"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'-其中member1member2Foo的成员。

请注意,jQuery中没有"bug"——虽然HTTP规范没有禁止请求体,但浏览器很可能会禁止(如果是这样,jQuery就无法发送),而且服务器很可能永远不会读取它。这是不可接受的做法。它在缓存方面也可能存在有趣的问题,因为浏览器不会缓存POST、PUT、DELETE等,但如果响应标头不禁止,则会缓存GET——这可能会对客户端应用程序产生严重的副作用。我建议您查看带有请求主体的SO:HTTPGET,以了解有关此主题的更多信息和一些有用的链接。

同样,当使用jQuery时——您也不需要将对象转换为JSON——只需在选项的data成员中传递javascript对象,jQuery就会将其转换为正确的格式。

或者应该是这样,Web API理解jQuery将其传递为.

的格式