2010-07-12 25 views
29

我使用python写埃尔格REST客户端,即使请求成功,我得到这样的回应:Python的httplib的ResponseNotReady

Traceback (most recent call last): 
    File "testclient.py", line 94, in <module> 
    result = sendMessage(token, h1) 
    File "testclient.py", line 46, in sendMessage 
    res = h1.getresponse().read() 
    File "C:\Python25\lib\httplib.py", line 918, in getresponse 
    raise ResponseNotReady() 
httplib.ResponseNotReady 

望着头,我看到(“内容长度','5749'),所以我知道那里有一个页面,但我不能使用.read()来查看它,因为异常出现了。 ResponseNotReady意味着什么,为什么我看不到返回的内容?

+0

您是否重新使用连接? – ChristopheD 2010-07-12 19:34:21

+0

确实。奇怪的是,有时它起作用,有时它不起作用。尽管如此,我无法确定什么样的行为。 – directedition 2010-07-12 21:39:31

回答

35

确保您不重复使用先前连接中的同一个对象。一旦服务器保持活动状态结束并且套接字关闭,您将点击此项。

+1

通常,我不打扰重复使用HttpRequest对象,除非我有一个特定的,性能驱动的需要。只是一次性'em – rossipedia 2010-08-06 20:31:19

+0

在我的情况下,添加'preload_content = False'解决了这个问题。这里是代码片段:'http = urllib3.PoolManager(threadsNo,maxsize = threadsNo,block = True); request = http.request('GET',queryUrl,preload_content = False)'看起来像'request.release_conn()'并不真正释放前一个连接对象,除非上述参数传递给http.request。更多细节在这里:https://urllib3.readthedocs.org/en/latest/pools.html – dex 2015-09-08 07:06:46

2

我也陷入了这种相同的异常的今天,使用此代码:

conn = httplib.HTTPConnection(self._host, self._port) 
    conn.putrequest('GET', 
     '/retrieve?id={0}'.format(parsed_store_response['id'])) 
    retr_response = conn.getresponse() 

我没注意,我用putrequest而非request;我正在混合我的界面。因为我还没有实际发送请求,所以引发了ResponseNotReady

49

以前的答案是正确的,但还有另外一种情况,您可以得到该例外: 这是如果您执行多个请求而不完全读取中间响应的情况。

例如:

conn.request('PUT',...) 
conn.request('GET',...) 
# will not work: raises ResponseNotReady 

conn.request('PUT,...) 
r = conn.getresponse() 
r.read() # <-- that's the important call! 
conn.request('GET',...) 
r = conn.getresponse() 
r.read() # <-- same thing 

等。

+0

这就是我所需要的.read(),所以我可以重用我的连接。 – schwiz 2014-02-11 19:54:09

+0

是.read()很贵。如果我不关心回应怎么办?我可以让它运行得更快吗?> – SoulMan 2016-07-07 06:58:19

+2

@ronnefeldt,Python文档在https://docs.python.org/3/library/http.client.html有以下注释:“请注意,您必须先阅读整个响应你可以发送一个新的请求到服务器。“。 – mvsagar 2016-07-12 06:15:57

0

此外,如果服务器发送没有Content-Length标头的响应,则会发生类似的错误,如果使用Keep-Alive并且通过同一个套接字发送另一个请求,将会削弱HTTP客户端的状态。

0

如果防火墙阻止连接,也会发生这种情况。