【问题标题】:When sending a POST request, when should I JSON.stringify() it or not?发送 POST 请求时,我什么时候应该 JSON.stringify() 呢?
【发布时间】:2017-11-11 16:44:07
【问题描述】:

在查看来自不同地方的教程和代码示例时,我注意到有时在代码中,通过 HTTP 请求中的“数据”标头发送的 JSON 对象在发送之前会使用JSON.stringify(data) 进行处理,有时他们会发送它没有先被“字符串化”。

使用 .NET WEB API 教程中的示例,客户端代码:

var data = {
    Email: self.registerEmail(),
    Password: self.registerPassword(),
    ConfirmPassword: self.registerPassword2()
};

$.ajax({
    type: 'POST',
    url: '/api/Account/Register',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(data)
}).done(function (data) {
    self.result("Done!");
}).fail(showError);

在这个例子中,如果我理解正确的话,这会将data 转换成类似的东西: {"Email":"alice@example.com","Password":"Password1!","ConfirmPassword":"Password1!"}

但在这部分来自相同的客户端代码:

var loginData = {
    grant_type: 'password',
    username: self.loginEmail(),
    password: self.loginPassword()
};

$.ajax({
    type: 'POST',
    url: '/Token',
    data: loginData
}).done(function (data) {
    self.user(data.userName);
    // Cache the access token in session storage.
    sessionStorage.setItem(tokenKey, data.access_token);
}).fail(showError);

未使用 JSON.stringify()。会有什么区别?如果我理解正确的话,HTTP 请求是基于文本的,因此我曾经对所有请求进行字符串化。

编辑:

这些是 KnockoutJS 的数据绑定元素:

//...Other HTML markups...

<input class="form-control" type="text" data-bind="value: registerEmail"/>
//...Other HTML markups...

<input class="form-control" type="password" data-bind="value: registerPassword"/>
//...Other HTML markups...

<input class="form-control" type="password" data-bind="value: registerPassword2" />
//...Other HTML markups...

<input class="form-control" type="text" data-bind="value: loginEmail"/>
//...Other HTML markups...

<input class="form-control" type="password" data-bind="value: loginPassword"/>

【问题讨论】:

  • 我猜这是因为如果数据是一个对象,如果它是一个字符串,则调用 JSON.stringify,它只是直接发送
  • @MrZach 从var datavar loginData 来看,不都是JS变量吗?
  • 在第一个示例中,您将对象转换为字符串并将其设置为要传递给 ajax 函数的对象的属性“数据”。第二个示例您没有将对象转换为字符串(通过 JSON.stringify),因此对象的“数据”属性将是一个对象,而不是第一个示例中的字符串。
  • @MrZach 好的,我明白了,您知道有任何描述此内容的文档吗?

标签: jquery json ajax http-post


【解决方案1】:

如果您通过发布请求发送的对象没有嵌套对象,则无需将其转换为字符串即可安全地发送数据。

否则,如果您的有效负载(数据)是这样的:

var data={
  Email:"username",
  Password:"password",
  extraOptions:{
    option1: { Verified:true },
    option2: { empty:false } 
  }
};

然后“JSON.stringify()”它。或者您的请求正文 JSON 将如下所示。

{ 
  Email:"username",
  Password:"password",
  extraOptions[option1][Verified]:true,
  extraOptions[option2][empty]:false
} 

并将数据发送为:

$.ajax({
    type: 'POST',
    url: '/api/Account/Register',
    contentType: 'application/json; charset=utf-8',
    data: {data:JSON.stringify(data)}
}).done(function (data) {
    self.result("Done!");
}).fail(showError);

所以在你的后端“req.body.data”是你的字符串。

var json=JSON.parse(req.body.data)

【讨论】:

    【解决方案2】:

    两种方式都可以将数据发送到后端。如果您发送字符串数据,则需要在后端进行解析。即使你发送像Array,Object这样的数据,你也可以直接赋值给任何变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2014-01-19
      • 2019-08-22
      • 2021-09-07
      相关资源
      最近更新 更多