容易的方式有人能解釋如何使jQuery
在querystring
代替發送實際json
?jQuery的AJAX,如何發送JSON,而不是查詢字符串
$.ajax({
url : url,
dataType : 'json', // I was pretty sure this would do the trick
data : data,
type : 'POST',
complete : callback // etc
});
這將在事實上將您精心準備json
到querystring
。其中一個煩人的事情是,在你的對象的任何array: []
將被轉換,因爲querysting
的限制可能是array[]: []
。
-update-
正確的方法可以在下面的答案中找到:
$.ajax({
url : url,
dataType : 'json',
contentType: 'application/json; charset=UTF-8', // This is the money shot
data : data,
type : 'POST',
complete : callback // etc
});
請注意,這需要合適的CORS頭的服務器端,並違背了一些例子在網絡上,允許報頭不能使用通配符。 (允許來源即可。)
{
Content-Type : 'application/json',
Access-Control-Allow-Origin : '*',
Access-Control-Allow-Headers : 'Content-Type' // You cannot use '*'
}
-update-
請注意是jQuery
現在將發送兩個請求,一個完成握手和一個符合實際的內容。這是稱爲pre-flight的正常HTTP行爲。第一個請求將是一個OPTIONS標題,以確定服務器是否實際上與計劃的請求兼容。
所以記住,如果你希望你的服務器是通用的,使用查詢字符串只發送一個請求。使用真JSON發送至少兩個請求,一個握手。
這與我的頭搞亂,所以我想我應該讓你(潛在的讀者)事先知道。
'dataType'對數據的發送方式沒有任何影響。它只是規定了你希望通過調用返回**的數據類型。如果你想向服務器指明你在'data'屬性中指定了什麼類型的數據,你需要設置'contentType'屬性類似於'contentType:「application/json」' – Nope
感謝您的澄清。但是在這種情況下,如果服務器在響應中提供了內容類型標題,爲什麼還需要指定響應類型客戶端? – Redsandro
您不需要*指定它,默認情況下,jQuery將嘗試根據響應的MIME類型進行智能猜測。但是,通過指定它,您明確告訴jQuery您期望從服務器獲得哪種類型,並且jQuery將嘗試將響應轉換爲該類型的對象。沒有指定它,並且讓jQuery做出猜測可能會導致jQuery將響應轉換爲意外的格式,即使您從服務器發送了JSON。檢查文檔以獲取有關dataType的更多詳細信息:http://api.jquery.com/jQuery.ajax/ – Nope