2017-11-11 402 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這樣的數據,也可以直接分配給任何變量。