2012-08-25 144 views
0

我想對在Flask上運行的我的RESTful API使用類型爲'GET'的jQuery ajax調用。在我的請求中,我想將一些數據作爲JSON發佈。將json嵌入到jquery ajax GET請求

我正在爲POST請求做同樣的事情,他們像魅力一樣工作。但是使用GET Flask會給我提供400個錯誤,並且深入瞭解它,看起來JSON在路上({%22email%22:%[email protected]%22})部分被URIEncoded編碼。

我試過使用decodeURIComponent,因爲我是JSON.stringifying json的ajax數據參數,但沒有區別。

sessiontoken = "123abc"; 
jsonData = {"email": email}; 

$.ajax({ 
    type: 'GET', 
    crossDomain: true, 
    url: 'http://someserver/sessions/' + sessiontoken, 
    dataType: 'json', 
    processData: false, //added this to see if it helps, it didn't 
    contentType: "application/json", 
    async: false, 
    data: JSON.stringify(jsonData), 
    success: function(data){ 
     //I'd be happy 
    }, 
    error: function(data){ 
     //This is where I get as my backend throws a 400 on me due to the screwed up json 
    } 
}); 

這使我瘋狂,因爲我似乎無法在地球上找到任何人有同樣的問題。我以前一直在謾罵,以前從未面對過這種愚蠢的事情。

編輯:好吧,好像我需要放棄我的目標,只是傳遞任何參數作爲查詢字符串,而不是嘗試將它們添加到請求正文。我想這裏沒有什麼錯,例如這裏討論的:REST API Best practices: Where to put parameters?

回答

1

如果你試圖設置任何數據到ajax的GET請求,它將被轉換爲URL字符串的參數。 Ofcourse,如「任何符號將被表示爲%URL_CODE(see all codes),你會得到查詢關鍵詞,比如未來:組織你的RESTful服務

http://someserver/sessions/sessiontoken?{%22email%22:%[email protected]%22} 

最好的辦法是DESCRIPT查詢的URI的部分,你可以把JSON的另一種方式。成URL參數,並解析URL編碼服務器端的符號。

+0

這種方式缺乏URL清潔。電子郵件地址的字母會使您的URL變得混亂,因此不太RESTful。而且,解析URL代碼在這裏沒有任何關係,在大多數框架中這通常是透明的,Flask不應該是例外 – Alexander

+0

沒錯,只是沒有想過。我編輯了一個答案。 – Arkady

+0

@Alexander,REST的目標之一是查詢參數中的關鍵值對,這就是爲什麼我認爲有可能在其中包含JSON。或者我錯了?至少我在某處看過它。 – Arkady

2

我懷疑你要追加jsonData作爲查詢參數。爲了這樣做,你不需要編碼。

$.ajax({ 
    ... 
    data: jsonData, 
    ... 
}); 

你結果URL會就像

http://someserver/sessions/123abc?email=foo%40bar.com 
+0

這種方式並非如此RESTful – Arkady

+0

沒錯。我第一次嘗試使用RESTful API時,我已經明白資源應該被標識爲sessiontoken。我將通過比較令牌和電子郵件來檢查令牌的有效性。而電子郵件的地方不應該在uri中,而是通過例如JSON。 –