python请求chunked响应

时间:2013-05-16 03:43:20

标签: xml python-requests chunked-encoding

我正在使用Python Requests包编写一个简单的rest客户端。 这是我的代码 -

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 个答案:

答案 0 :(得分:1)

当您计划迭代响应内容时,您只能使用stream=True。如果您打算立即打印回复内容,那么stream=True将不会为您带来任何性能优势。在您调用r.textr.content之后,它只会将内容延迟加载到内存中,然后将其加载到内存中。如果您想阻止将整个内容加载到内存中,请查看下面的内容。对于另一个问题,试试这个:

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

print('text: ' + r.content)

如果您使用的是2.x,r.text是一个unicode对象,可能无法转换为ASCII。

我不太确定为什么没有stream=True的分块响应不起作用,但是正确使用它的唯一方法(不像使用r.content或{一样下载所有内容{1}})使用r.textiter_content。要将所有响应内容收集到一个字符串中,您可以执行以下操作:

iter_lines

相关说明:在返回的字符串上使用contents = ''.join(r.iter_content(224)) # stole the number from your comment 方法将提供高度不一致的结果。如果您的API允许它发送decode标题,那么您始终可以确保获取可以解码的数据。

你还没有这样做,所以我没有建议,但是如果你坚持打印信息,那么你将需要它,特别是如果它是一个国际流行网站的API