尝试在Python(WSGI)和NodeJS+Express应用程序之间发出POST请求。它们在不同的服务器上。在
问题是,当使用不同的IP地址(即,专用网络与公用网络)时,公用网络上的urllib2
请求成功,但是对专用网络的相同请求却以502 Bad Gateway
或URLError [32] Broken pipe
而失败。在
我使用的urllib2
代码是:
req = urllib2.Request(url, "{'some':'data'}", {'Content-Type' : 'application/json; charset=utf-8'})
res = urllib2.urlopen(req)
print f.read()
现在,我还使用^{
得到一个200 OK
响应。这种替代方法适用于两个网络。在
我感兴趣的是,是否有一些我不知道的urllib2
请求所需的其他配置,或者我是否需要查看一些可能丢失的网络配置(我不认为是这样,因为备用请求方法有效,但我肯定是错的)。在
如有任何建议或建议,我们将不胜感激。谢谢!在
这里的问题是,正如Austin Phillips所指出的,^{} 的构造函数的
data
参数:通过传递JSON编码的数据而不是urlencoded的数据,您在某个地方混淆了它。在
但是,} :
Request
有一个方法^{如果您使用这个,您可能还应该使用
add_header
,而不是在构造函数中传递它,尽管文档中似乎没有特别提到这一点。在所以,这应该有效:
你在评论中说:
如果你想找到深层次的问题,你不可能仅仅通过查看客户端源代码来实现。找出“为什么X工作而Y失败”的第一步网络代码就是精确地计算出X和Y各自发送的字节。然后,您可以尝试缩小相关差异,然后找出代码的哪一部分导致Y在相关位置发送错误的数据。在
您可以通过在服务上记录(如果您控制它的话)、运行Wireshark等等来实现这一点,但是对于简单的情况,最简单的方法是netcat。您需要为您的系统阅读
man nc
(而且,在Windows上,您需要在运行netcat之前获取并安装netcat),因为每个版本的语法都不同,但它总是像nc -kl 12345
这样简单的东西。在然后,在您的客户机中,更改URL以使用
localhost:12345
代替主机名,它将连接到netcat并发送其HTTP请求,该请求将被转储到终端。然后您可以复制它并使用nc HOST 80
并粘贴它来查看实际服务器如何响应,并使用它缩小问题所在。或者,如果你被卡住了,至少你可以复制数据并粘贴到你的SO问题上。在最后一件事:这几乎肯定与您的问题无关(因为您使用
^{pr2}$requests
发送完全相同的数据,并且它正在工作),但是您的数据实际上不是有效的JSON,因为它使用单引号而不是双引号。根据the docs,string
定义为:(文档也有很好的图形表示。)
一般来说,除了非常简单的测试用例外,您不希望手工编写JSON。在很多情况下(包括你的),你所要做的就是用
"…"
替换json.dumps(…)
,所以这不是一个严重的困难。所以:那么,它为什么起作用呢?好吧,在JavaScript中,单引号字符串是合法的,以及反斜杠转义等在JSON中无效的东西,任何使用restrictedeval(或者更糟的是raw eval)进行解析的JS代码都会接受它。而且,由于很多人都习惯于编写糟糕的JSON,因此许多浏览器的原生JSON解析器和许多其他语言的JSON库都有解决方法来允许常见错误。但你不应该依赖这个。在
相关问题 更多 >
编程相关推荐