2013-03-20 128 views
3

我正在使用elasticsearch,並且RESTful API支持在搜索條件的GET請求中支持閱讀主體。發送帶有正文的GET請求

目前,我正在做

response = urllib.request.urlopen(url, data).read().decode("utf-8") 

如果data存在,它會發出一個帖子,否則GET。我怎麼能強制GET,儘管我包括數據(這應該是在POST的請求正文)

鈮:我知道我可以在Url中使用source屬性,但查詢我們運行起來非常複雜,查詢定義非常冗長,導致查詢時間過長。

+2

通過Roy Fielding的[關於該問題的評論](http://tech.groups.yahoo.com/group/rest-discuss/message/9962)(via:http:// stackoverflow .com/questions/978061/http-get-with-request-body),似乎這是對HTTP規範的濫用,並且解決方案將爲彈性搜索人員所依賴。基本上,只有當服務器存在時才允許請求主體崩潰,而不是因爲它意味着以任何方式進行處理。 (根據Wiki,Roy Fielding是HTTP的作者之一,也是REST的創始人之一,所以我猜他會知道的。) – millimoose 2013-03-20 16:55:30

+0

@millimoose這是一個間接參數 - 從語義上講,當考慮REST服務時它是有意義的 - GET涉及邏輯操作,而不是通信機制 – Basic 2013-03-20 16:58:18

+0

這就是說,我相信['http.client'](http://docs.python.org/3.0/library/http.client.html)可能比'urllib'並允許你構造「不尋常」的請求。 – millimoose 2013-03-20 17:00:24

回答

7

我不知道不錯這種方式使用urllib。然而,requests使得它瑣碎(和,事實上,瑣碎任意動詞和請求內容)使用requests.request *功能:

requests.request(method='get', url='localhost/test', data='some data') 

構建一個小的測試Web服務器將顯示該數據在確實發送請求的主體,並且服務器感知的方法確實是GET。

*請注意,我鏈接到requests.api.requests代碼,因爲這是實際函數定義所在的位置。您應該使用requests.request(...)

+0

+1:我忘記了請求存在,它可能比'http.client'更不繁重的選擇。 – millimoose 2013-03-20 18:23:58

+0

這聽起來像是一個很好的妥協,我會放棄它。 @millimoose感謝您的幫助。 – Basic 2013-03-20 22:13:01

相關問題