我该如何创建带参数的GET请求?

10

默认情况下,对我来说似乎每个带参数的 urlopen() 都发送 POST 请求。如何设置调用以发送 GET 请求?

import urllib
import urllib2

params = urllib.urlencode(dict({'hello': 'there'}))
urllib2.urlopen('http://httpbin.org/get', params)

urllib2.HTTPError: HTTP Error 405: METHOD NOT ALLOWED


1
代码 dict({...}) 是多余的,因为 {...} 语法已经创建了一个字典,所以你可以直接使用 urlencode({'hello': 'there'}) - Dietrich Epp
3个回答

12

你可以使用与post请求类似的方式:

import urllib
import urllib2

params = urllib.urlencode({'hello':'there', 'foo': 'bar'})
urllib2.urlopen('http://somesite.com/get?' + params)

仅在进行POST请求时才应提供第二个参数,例如在发送application/x-www-form-urlencoded的内容类型时。


1
非常接近了... urlencode 不会添加 ?。此外,dict({...}) 是多余的,因为 {...} 语法已经创建了一个 dict - Dietrich Epp
不得不在URL末尾添加?,但现在可以正常工作了。谢谢。 - user1447941
是的,@Dietrich Epp,你说得对。我复制了提问者相同的代码片段。 - felipsmartins
我编辑了我的帖子的代码片段,以避免其他人阅读时产生疑惑。 - felipsmartins

4
当提供数据参数时,HTTP请求将是POST而不是GET。 请尝试改用urllib2.urlopen('http://httpbin.org/get?hello=there')

2
如果您正在进行GET请求,则需要传递查询字符串。您可以在参数之前通过在URL末尾放置一个问号'?'来实现这一点。
import urllib
import urllib2

params = urllib.urlencode(dict({'hello': 'there'}))
req = urllib2.urlopen('http://httpbin.org/get/?' + params)
req.read()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接