我已经不再使用python请求库了,因为开始使用Google App Engine有点繁琐。相反,我正在使用urllib2,它有更好的支持。不幸的是,以前使用请求库的POST请求不再适用于urllib2。
请求代码如下
values = { 'somekey' : 'somevalue'}
r = requests.post(some_url, data=values)
使用urllib2,代码如下
values = { 'somekey' : 'somevalue'}
data = urllib.urlencode(values)
req = urllib2.Request(some_url, data)
response = urllib2.urlopen(req)
不幸的是,后者引发了以下错误
HTTP Error 405: Method Not Allowed
我发布的网址格式如下:
some_url = 'http://ec2-11-111-111-1.compute-1.amazonaws.com'
我有read使用urllib2跟踪斜杠有问题,但是当我按如下方式添加斜杠时
some_url = 'http://ec2-11-111-111-1.compute-1.amazonaws.com/'
我仍然得到同样的错误。
目的地没有重定向 - 因此请求不应转换为GET。即使它是,该url实际上接受GET和POST请求。 EC2 linux实例正在运行django,我可以看到它成功接收请求并使用它 - 所以不会返回405.由于某种原因,urllib2正在拾取405并抛出异常。
关于可能出错的任何想法?
根据@ philip-tzou的好话,以下信息可能会有所帮助
print req.get_method()
收益POST
print req.header_items()
收益[]
添加用户代理标头(如@ padraic-cunningham建议的那样)不幸地解决了它。我添加了urllib2 example
中显示的相同标头 user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
headers = {'User-Agent': user_agent}
data = urllib.urlencode(values)
req = urllib2.Request(some_url, data, headers)
正如@furas建议的那样,我已经将请求发送给requestb.in,以便仔细检查发送的内容。这确实是一个POST请求,包含以下标题:
Connection: close
Total-Route-Time: 0
X-Cloud-Trace-Context: ed073df03ccd05657<removed>2a203/<removed>129639701404;o=5
Connect-Time: 1
Cf-Ipcountry: US
Cf-Ray: <removed>1d155ac-ORD
Cf-Visitor: {"scheme":"http"}
Content-Length: 852
Content-Type: application/x-www-form-urlencoded
Via: 1.1 vegur
X-Request-Id: 20092050-5df4-42f8-8fe0-<removed>
Accept-Encoding: gzip
Cf-Connecting-Ip: <removed>
Host: requestb.in
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppEngine-Google; (+http://code.google.com/appengine; appid: s~<removed>)
现在req.header_items()
会产生[('User-agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)')]
作为比较,来自请求POST的标题是
Cf-Connecting-Ip: <removed>
Accept-Encoding: gzip
Host: requestb.in
Cf-Ipcountry: US
Total-Route-Time: 0
Cf-Ray: 2f42a45185<removed>-ORD
Connect-Time: 1
Connection: close
Cf-Visitor: {"scheme":"http"}
Content-Type: application/x-www-form-urlencoded
Content-Length: 852
X-Cloud-Trace-Context: 8932f0f9b165d9a0f698<removed>/1740038835186<removed>;o=5
Accept: */*
X-Request-Id: c88a29e1-660e-4961-8112-<removed>
Via: 1.1 vegur
User-Agent: python-requests/2.11.1 AppEngine-Google; (+http://code.google.com/appengine; appid: s~<removed>)