簡體   English   中英

為什么用jquery ajax執行GET請求時不能將json數組作為數據傳遞?

[英]Why can't I pass a json array as data when doing GET request with jquery ajax?

如果我運行這樣的get請求:

 $.ajax({
    url: 'http://localhost:8000/api/points/',
    contentType:"application/json",
    dataType: "json",
    data: JSON.stringify({"content_type":content_type,"object_id":object_id}),
    type: 'GET',
  }).error(function(r){ $(output).text('error') })
  .success(function(r){
    $(output).text(r.count);
  })

它的請求轉到:

http:// localhost:8000 / api / points / ?{%22content_type%22:8,%22object_id%22:40}

顯然那很糟糕。 如果我不執行JSON.stringify() ,它可以正常工作,但是為什么呢?

奇怪的是,如果我執行POST請求,那就相反了! 我必須對數據進行字符串化處理,否則它將無法正常工作。 那么為什么會有區別呢?

首先,讓我們解決您的請求:

var req = $.ajax({
    method: "GET",
    url: "http://localhost:8000/api/points/",
    dataType: "json", // is you telling jQuery what kind of response to expect. 
    data : {id : '12345'}
});

req.done(function(data){
    // do something with the data
});

req.fail(function(jqXHR, status, err){
    // do something in case of failure
    throw err;
});

接下來了解您要處理的內容:

data :PlainObject或String或Array要發送到服務器的數據。 如果還不是字符串,則將其轉換為查詢字符串。 它被附加到GET請求的URL上。 默認情況下,作為對象傳遞到data選項的數據(從技術上講,不是字符串)將被處理並轉換為查詢字符串 ,以適合默認的內容類型“ application / x-www-form-urlencoded” 。

注意: jQuery 1.8中將棄用jqXHR.success(),jqXHR.error()和jqXHR.complete()回調。 要准備將其最終刪除的代碼,請改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。

最后:

不需要: JSON.stringify({"content_type":content_type,"object_id":object_id})因為使用JSON.stringify只是一種錯誤的方法: { 'content_type' : 'type', 'object_id' : 'id' }

浦原的答案包含一些有用的建議,但似乎並沒有解決您的問題。

好吧,看來您的服務器端代碼希望在POST請求的正文中找到一個json對象。 為什么會這樣呢? 因為您將內容類型指定為“ application / json”。 因此,在使用PUT的情況下,當您使用JSON.stringify時,$。ajax調用中的數據就是一個恰好表示JSON對象的字符串。 這是按原樣通過的,因此可以正常工作。 您最終會發送類似

{“ content_type”:8,“ object_id”:40}

作為POST請求的主體,服務器端代碼很樂意對此進行處理。 不確定確切的服務器端技術是什么,但是大概它還會將content_type綁定到8並將object_id綁定到40,這使您很高興:-)但是,當您不使用JSON.stringify將對象轉換為JSON字符串時,您會最終將對象本身傳遞給$ .ajax,使其以已知的方式將其轉換為字符串。 好吧,它只知道一種:好的舊的url編碼方式。 因此,服務器仍將期待JSON對象,但會獲取

content_type = 8&object_id = 40

作為PUT請求的主體。 這不會幸福。 這不是您承諾的內容類型的JSON對象! :-)

現在,轉到GET請求的情況。 此處的內容類型幾乎無關緊要,因為消息正文為空。 如果使用JSON.stringify,則作為請求數據傳遞的內容是一個怪異的JSON對象,它表示字符串和作為URL獲得的怪異

http:// localhost:8000 / api / points / ?{%22content_type%22:8,%22object_id%22:40}

如您所料,服務器不會很好地接受您。 服務器滿意的是

http:// localhost:8000 / api / points /?content_type = 8&object_id = 40

當您不使用JSON.stringify而是將一對漂亮的屬性值對傳遞給$ .ajax時,這正是產生的結果。 它只是對它們進行url編碼,就像在PUT情況下所做的那樣,服務器很高興。

因此$ .ajax總是對由屬性值對組成的對象進行url編碼。 在大多數情況下,這很好。 解決不使用JSON.stringify而執行POST的代碼的一種方法是,簡單地不在$ .ajax調用中放入內容類型參數(在這種情況下,默認值為'application / x-www-form-urlencoded; charset = UTF-8')。

但是,如果要傳遞更復雜,更深層次的對象,則使用某種對象序列化格式,您必須設置適當的內容類型,然后像在此一樣使用相應的編碼(JSON,XML等)將數據作為字符串傳遞。

希望這能回答你的問題 :-)

也請看看http://api.jquery.com/jquery.ajax/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM