使用urllib2进行POST调用而不是GET

| urllib2和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)。     
已邀请:
        之前可能已经回答过:Python URLLib / URLLib2 POST。 您的服务器可能执行了从
http://myserver/post_service
http://myserver/post_service/
的302重定向。执行302重定向后,请求将从POST更改为GET(请参见问题1401)。尝试将
url
更改为
http://myserver/post_service/
。     
        分阶段执行,然后修改对象,如下所示:
# 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
这样,您只需扩展method的值,甚至将其包装在函数中,即可扩展到发出
PUT
DELETE
HEAD
OPTIONS
请求。根据您要执行的操作,您可能还需要其他HTTP处理程序,例如用于多文件上传。     
        请求模块可以减轻您的痛苦。
url = \'http://myserver/post_service\'
data = dict(name=\'joe\', age=\'10\')

r = requests.post(url, data=data, allow_redirects=True)
print r.content
    
        阅读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建议的那样,请考虑请求,这很棒。 编辑:这就是说,我不知道为什么将数据传递给urlopen()不会导致POST请求。这应该。我怀疑您的服务器正在重定向或行为异常。     
        如果您提供数据参数(如您所做的那样),它应该发送POST: 从文档: \“当提供data参数时,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()
也许这可以帮助     

要回复问题请先登录注册