43

我正在使用 python 为 elgg 编写一个 REST 客户端,即使请求成功,我也会得到以下响应:

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

查看标题,我看到 ('content-length', '5749'),所以我知道那里有一个页面,但我无法使用 .read() 来查看它,因为出现了异常。ResponseNotReady 是什么意思,为什么我看不到返回的内容?

4

6 回答 6

77

以前的答案是正确的,但在另一种情况下您可能会遇到该异常:

在不完全读取任何中间响应的情况下发出多个请求。

例如:

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

等等。

于 2012-06-04T04:03:31.997 回答
44

确保您没有重复使用先前连接中的相同对象。一旦服务器保持活动结束并且套接字关闭,您将点击它。

于 2010-07-12T23:13:32.673 回答
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被提出是因为我还没有真正发送请求。

于 2010-08-06T20:29:59.850 回答
1

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

于 2015-05-01T17:10:58.573 回答
0

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

于 2018-02-06T07:58:56.183 回答
0

无法为@Bokeh 的答案添加评论;因为我在这个平台上还没有必要的声誉。

因此,添加为答案:Bokeh 的答案对我有用。

我试图在同一个连接对象上按顺序传输多个请求。对于少数回复,我想稍后处理回复,因此错过了阅读回复。

根据我的经验,我支持 Bokeh 的回答:

response.read() 在每次请求之后都是必须的。即使您是否希望处理响应。

从我的角度来看,如果没有 Bokeh 的回答,这个问题将是不完整的。谢谢@Bokeh

于 2019-03-12T04:43:17.333 回答