【发布时间】:2013-02-06 03:45:12
【问题描述】:
尝试在 Python (WSGI) 和 NodeJS + Express 应用程序之间发出 POST 请求。它们位于不同的服务器上。
问题是当使用不同的 IP 地址时(即私有网络与公共网络),公共网络上的 urllib2 请求成功,但对私有网络的相同请求失败并出现 502 Bad Gateway 或 @987654326 @。
我使用的urllib2 代码是这样的:
req = urllib2.Request(url, "{'some':'data'}", {'Content-Type' : 'application/json; charset=utf-8'})
res = urllib2.urlopen(req)
print f.read()
现在,我也使用requests 对请求进行了编码:
r = requests.post(url, headers = {'Content-Type' : 'application/json; charset=utf-8'}, data = "{'some':'data'}")
print r.text
并获得200 OK 响应。这种替代方法适用于两种网络。
我有兴趣找出我不知道的urllib2 请求是否需要一些额外的配置,或者我是否需要查看一些可能丢失的网络配置(我不相信就是这样,因为备用请求方法有效,但我肯定是错的)。
对此的任何建议或指示将不胜感激。谢谢!
【问题讨论】:
-
如果您比较两者发送的标头,它们将不完全相同。 (例如,
requests默认为Accept-Encoding: gzip, deflate, compress,而urllib为Accept-Encoding: identity。)捕获每个版本的请求标头,并使用例如nc对服务器重放它们并查看它如何响应。urllib2标头的某些内容导致 502 错误,或者它正在执行某种重定向/等。 urllib2 不能理解 requests 。 -
另外...如果它与
requests一起使用,您是否有理由不能只使用requests? -
urllib2.Request的文档表明 data 参数应该被 urlencoded 为 application/x-www-form-urlencoded。 -
+1 到@AustinPhillips。看起来您可以创建一个没有数据的
Request,然后使用任意字节字符串调用req.add_data(data),然后再调用urlopen。试试看它是否有效。 -
@abarnert 谢谢!我会尝试添加数据。我不想只是切换到
requests而不找出为什么我看到这个问题的原因是可能存在一些更深层次的潜在问题,这可能会再次出现并导致更难检测的问题稍后的。谢谢!
标签: python node.js http rest urllib2