2013-03-20 127 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

相关问题