2017-11-11 123 views
1

虽然从不同的地方看教程和代码示例,但我注意到有时在代码中,通过HTTP请求中的“数据”标头发送的JSON对象在发送之前会使用JSON.stringify(data)进行处理,并且有时会在不被“串化“首先。当发送POST请求时,我应该何时JSON.stringify()它或不?

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":"[email protected]","Password":"Password1!","ConfirmPassword":"Password1!"}

但在这个

从.NET WEB API教程,客户端代码使用实例部分来自相同的客户端代码:

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"/> 
+0

我想这是因为JSON.stringify被调用,如果数据是一个对象,如果它的字符串,它只是直接发送 –

+0

@MrZach从'var data'和'var loginData'判断,不是他们都JS变量? – CodeIntern

+0

在第一个示例中,您将对象转换为字符串并将其设置为传递给ajax函数的对象的属性“数据”。 第二个例子是你没有将对象转换为字符串(通过JSON.stringify),所以对象的“data”属性将是一个对象,而不是第一个例子中的字符串。 –

回答

0

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