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の回答にコメントを追加できません。私はこのプラットフォームでまだ必要な評判を持っていないので。

だから、答えとして追加する:ボケの答えは私のために働いた。

同じ接続オブジェクトを介して複数のリクエストを順番にパイプラインしようとしていました。いくつかの応答については、後で応答を処理したかったので、応答を読むことができませんでした。

私の経験から、私はボケの答えを2番目にしています。

response.read()は、各リクエストの後に必須です。応答を処理したい場合でも。

私の立場からすると、この質問はボケの答えがなければ不完全だったでしょう。ありがとう@Bokeh

于 2019-03-12T04:43:17.333 に答える