3

Python Requests パッケージを使用して、単純なレスト クライアントを作成しています。ここに私のコードがあります -

r = requests.get(url, auth=(user, passwd), stream=True, verify=False)
print('headers: ')
pprint.pprint(r.headers)
print('status: ' + str(r.status_code))
print('text: ' + r.text)

出力は次のとおりです-

headers: 
    {'content-type': 'text/xml;charset=UTF-8',
     'date': 'Thu, 16 May 2013 03:26:06 GMT',
     'server': 'Apache-Coyote/1.1',
     'set-cookie': 'JSESSIONID=779FC39...5698; Path=/; Secure; HttpOnly',
     'transfer-encoding': 'chunked'}
status: 200

Traceback (most recent call last):
  File "C:\...\client.py", line 617, in _readinto_chunked
    chunk_left = self._read_next_chunk_size()
  File "C:\...\client.py", line 562, in _read_next_chunk_size
    return int(line, 16)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid continuation byte

その要求に対する応答は XML です。チャンクされているように見えます。チャンクされた応答を読み取る特別な方法はありますか? XML 応答全体を 1 つの文字列に入れたいと考えています。

4

1 に答える 1

3

stream=True応答のコンテンツを繰り返し処理することを計画している場合にのみ使用します。応答コンテンツをすぐに印刷することを計画しているstream=True場合、パフォーマンス上の利点はありません。r.textorを呼び出してからメモリにロードされるまで、コンテンツのメモリへのロードを延期するだけですr.content。コンテンツ全体がメモリに読み込まれないようにする場合は、以下を確認してください。他の問題については、これを試してください:

print('text:')
print(r.text)

また

print('text: ' + r.content)

2.x を使用している場合r.textは、ASCII に変換できない可能性がある Unicode オブジェクトです。

チャンクされた応答が なしでは機能しない理由はよくわかりませんstream=Trueが、それを適切に使用する唯一の方法 ( または のように一度にすべてをダウンロードする必要はありません) は、r.contentまたはのいずれかr.textを使用することです。すべての応答コンテンツを 1 つの文字列にまとめるには、次のようにします。iter_contentiter_lines

contents = ''.join(r.iter_content(224))  # stole the number from your comment

関連する注意事項:decode返された文字列に対してメソッドを使用すると、非常に一貫性のない結果が得られます。API でAccept-Encodingヘッダーの送信が許可されている場合は、デコードできるデータを常に確実に取得できます。

あなたはまだそれを行っていないので、私はそれを提案しませんでしたが、情報を印刷することに固執している場合、特にそれが国際的に人気のある Web サイトへの API である場合は、それが必要になります。

于 2013-05-16T22:51:24.850 に答える