1

我正在使用 Knockout.js 和 ASP.NET Web ApiController 完成一个新项目。我看到的许多示例在将数据发布到服务器之前执行了一些手动 JSON 序列化。此外,请求内容类型同样经常设置为“application/json”。

我想知道为什么这是必要的。我假设有一些我还没有遇到过的东西,这使得这要么是必需的,要么至少是可取的。

目前,使用这些 jQuery ajax 选项向服务器发送我想要的任何数据都没有问题:

        cache: false,
        traditional: true,
        type: 'POST',

这是 POST 并绑定到 ApiController 操作方法的示例 JS 对象和相应的服务器端 C# 模型对象。

//JS object
var requestDataObject = {
    accountId: vm.accountId,
    range: [1, "a'b\"c", 3],
    start: new Date(2012, 12, 12)
};

//C# model object
public class RequestData
{
    public int AccountId { get; set; }
    public string[] Range { get; set; }
    public DateTime Start { get; set; }
}

//Action method signature
[HttpPost]
public HttpResponseMessage GetAccountUsage(RequestData requestData){
    ...

我错过了什么?

4

1 回答 1

6

从历史上看,GET(以及随后的 POST)只能发送键值对,并且键应该是唯一的。

当 PHP 出现时,它定义了“如果一个键包含方括号,让我们构建一个数组”。这使程序员能够调用他们的复选框name="chkbox[]",让表单正常提交,并$_POST['chkbox']作为数组读取。其他一些服务器语言定义,“如果在查询字符串中重复一个键,让我们构建一个数组”。

如果names[]=1要支持密钥,为什么不names[a][b][c]=1呢?服务器知道他们应该做什么:分配names = {a:{b:{c:"1"}}}

这使程序员能够对对象进行编码以查询字符串,但需要注意以下几点:

  • 每个值都是一个字符串
  • 数组和带有数字键的对象之间没有区别。PHP 不在乎,但有些服务器可能会。
  • 没有办法对空对象或数组进行编码。对于传统形式,这会导致空数组丢失。PHP 确实在乎。JQuery 通过发送一个空字符串来解决这个问题。
  • 这是非常低效的,因为必须为每个值重复路径:checkboxes[]=ch1&checkboxes[]=ch2&...vs.checkboxes=["ch1","ch2",...]
  • 您必须知道目标平台,因为 PHP 不喜欢(或求助于从喜欢的服务器上traditional读取)postVars.get("names[]")
  • 一些服务器根本不理解这种编码。

使用 JSON,

  • 您可以对数字、字符串null、...进行编码
  • ...数组,对象...
  • 空数组和对象很容易表示。您不必仅仅因为它可能是空的就测试每个数组和对象是否存在。
  • 没有钥匙是重复的,所以你不需要让你的钥匙很短
  • 如何用自动键表示数组是没有混淆的;无论发送到何处,JSON 都会对相同的结构进行编码。
  • 可以用任何语言解析 JSON。许多语言都内置了 JSON 支持,其余的可以获取库
  • 您只需要在服务器和客户端上多写一行。

简而言之,如果您只需要对键值对进行编码,那么这就是普通的 GET 或 POST 擅长的。如果您需要对数组进行编码,JSON 绝对值得考虑。如果您需要更复杂的东西,JSON 是使用某些服务器的唯一方法。

于 2012-12-20T23:24:17.727 回答