发送POST请求时,我应该在何时使用JSON.stringify()?

时间:2017-11-11 16:44:07

标签: jquery json ajax http-post

在查看来自不同地方的教程和代码示例时,我注意到有时在代码中JSON对象通过"数据" HTTP请求中的标头在发送之前使用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"/>

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果您通过 post 请求发送的对象没有嵌套对象,则发送数据而不将其转换为字符串是安全的。

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

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)