urlib2和POST调用有很多东西,但我遇到了一个问题。
我正在尝试对一个服务进行简单的POST调用:
url = 'http://myserver/post_service'
data = urllib.urlencode({'name' : 'joe',
'age' : '10'})
content = urllib2.urlopen(url=url, data=data).read()
print content
我可以看到服务器日志,当我发送数据时,它显示我正在进行GET调用urlopen的参数。
库引发了一个404错误(未找到),这对于GET调用来说是正确的,POST调用处理得很好(我也在尝试在HTML表单中使用POST)。
分阶段进行,并修改对象,如下所示:
# make a string with the request type in it:
method = "POST"
# create a handler. you can specify different handlers here (file uploads etc)
# but we go for the default
handler = urllib2.HTTPHandler()
# create an openerdirector instance
opener = urllib2.build_opener(handler)
# build a request
data = urllib.urlencode(dictionary_of_POST_fields_or_None)
request = urllib2.Request(url, data=data)
# add any other information you want
request.add_header("Content-Type",'application/json')
# overload the get method function with a small anonymous function...
request.get_method = lambda: method
# try it; don't forget to catch the result
try:
connection = opener.open(request)
except urllib2.HTTPError,e:
connection = e
# check. Substitute with appropriate HTTP code.
if connection.code == 200:
data = connection.read()
else:
# handle the error case. connection.read() will still contain data
# if any was returned, but it probably won't be of any use
这种方式允许您扩展到生成PUT
、DELETE
、HEAD
和OPTIONS
请求,只需替换方法的值,甚至将其封装在函数中即可。根据您尝试的操作,您可能还需要不同的HTTP处理程序,例如用于多文件上传。
这可能以前已经得到了回答:Python URLLib/ULLib2 POST。
您的服务器可能正在执行从http://myserver/post_service
到http://myserver/post_service/
的302重定向。当执行302重定向时,请求从POST变为GET(参见Issue 1401)。尝试将url
更改为http://myserver/post_service/
。
阅读urllib缺失手册。下面是POST请求的简单示例。
url = 'http://myserver/post_service'
data = urllib.urlencode({'name' : 'joe', 'age' : '10'})
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
print response.read()
正如@Michael Kent所建议的,请考虑请求,这太棒了。
EDIT:也就是说,我不知道为什么向urlopen()传递数据不会导致POST请求;它应该。我怀疑您的服务器正在重定向或行为不端。
请求模块可以减轻您的痛苦。
url = 'http://myserver/post_service'
data = dict(name='joe', age='10')
r = requests.post(url, data=data, allow_redirects=True)
print r.content
如果您提供数据参数(就像您正在做的那样),应该发送POST:
从文档中:"当提供数据参数时,HTTP请求将是POST而不是GET"
所以。。添加一些调试输出,看看客户端发生了什么。
你可以修改你的代码,然后再试一次:
import urllib
import urllib2
url = 'http://myserver/post_service'
opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))
data = urllib.urlencode({'name' : 'joe',
'age' : '10'})
content = opener.open(url, data=data).read()
试试这个:
url = 'http://myserver/post_service'
data = urllib.urlencode({'name' : 'joe',
'age' : '10'})
req = urllib2.Request(url=url,data=data)
content = urllib2.urlopen(req).read()
print content
url="https://myserver/post_service"
data["name"] = "joe"
data["age"] = "20"
data_encoded = urllib2.urlencode(data)
print urllib2.urlopen(url + "?" + data_encoded).read()
这可能有助于