当发送POST请求时,何时需要使用JSON.stringify(),何时不需要?

10

在查看来自不同地方的教程和代码示例时,我注意到有时在发送HTTP请求中通过"data"头部发送的JSON对象会在发送之前进行JSON.stringify(data)处理,而有时它们在发送之前不被“stringified”。

使用.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,而如果它是一个字符串,它就直接发送。 - Mr Zach
@MrZach 从 var datavar loginData 来看,它们都是 JavaScript 变量,对吗? - CodeIntern
在第一个示例中,您将对象转换为字符串,并将其设置为传递给ajax函数的对象的属性"data"。在第二个示例中,您没有将对象转换为字符串(通过JSON.stringify),因此对象的"data"属性将是一个对象,而不是像第一个示例中那样的字符串。 - Mr Zach
@MrZach 好的,我明白了。你知道有没有相关文档描述这个吗? - CodeIntern
2个回答

5
如果您通过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)

0

两种方式都可以向后端发送数据。如果您发送的是字符串数据,则需要在后端解析。即使您发送的是类似数组或对象的数据,您也可以直接分配给任何变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接