【发布时间】:2011-11-30 19:51:08
【问题描述】:
我正在尝试从 python 连接到本地运行的 Restlet 服务器,但连接无限挂起(如果我设置了超时,则会超时)。
import urllib2
handle = urllib2.urlopen("http://localhost:8182/contact/123") # hangs
如果我在 shell 中使用curl 打开上述 URL,结果会很快返回。如果我使用 urllib2 打开不同的本地服务(例如端口 8000 上的 Django Web 服务器),则 urllib2 可以正常工作。
我尝试禁用防火墙(我在 OS X 上这样做)。我尝试将 localhost 更改为 127.0.0.1。除了用户代理之外,来自 Restlet 的 curl 和 urllib2 连接的日志看起来都是一样的。
我的解决方法是通过subprocess 调用curl,但我宁愿理解为什么会失败。
这是我的 Restlet 资源的外观:
public class ContactResource extends ServerResource {
@Get
public String represent() throws Exception {
return "<contact details>";
}
//....
}
如果您需要更多信息/代码,请告诉我
【问题讨论】:
-
如果您尝试不同的超时值会发生什么?
urllib2.urlopen("...", timeout=1)? -
当 timeout=1 或 2 时,我得到“urllib2.URLError:
”并且handle.read() 返回空字符串 -
您的 Restlet 应用程序是否旨在根据 User-Agent 或 Accept 标头更改行为?此外,您在日志中看到 urllib2 的评论意味着服务器确实看到它连接并响应它 - urllib2 只是认为响应没有通过?
-
我的 Restlet 服务器非常基础(即遵循了一些教程),所以我没有添加任何用户代理/标头行为更改。我还应该提到,除了我的“/contact/123”网址不起作用之外,404 全面的页面(即“未找到请求的操作”)与 urllib 有相同的问题(无限期挂起)。
-
尝试观察网络上的内容(使用有线嗅探器、netcat),其中一些有效,另一些无效。然后手动重复这些(“telnet localhost 8182”并输入请求),直到找出触发差异的原因。
标签: java python curl urllib2 restlet