【发布时间】: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 data和var loginData来看,不都是JS变量吗? -
在第一个示例中,您将对象转换为字符串并将其设置为要传递给 ajax 函数的对象的属性“数据”。第二个示例您没有将对象转换为字符串(通过 JSON.stringify),因此对象的“数据”属性将是一个对象,而不是第一个示例中的字符串。
-
@MrZach 好的,我明白了,您知道有任何描述此内容的文档吗?
标签: jquery json ajax http-post