xml - python 请求分块响应

标签 xml python-requests chunked-encoding

我正在使用 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 响应放在一个字符串中。

最佳答案

只有在计划迭代响应内容时才使用 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.contentr.text) 是使用 iter_contentiter_lines。要将所有响应内容收集到一个字符串中,您可以执行以下操作:

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

相关说明:对返回的字符串使用decode 方法将提供高度不一致的结果。如果您的 API 允许它发送 Accept-Encoding header ,那么您始终可以确保取回可以解码的数据。

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

关于xml - python 请求分块响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16578635/

相关文章:

php - cURL 和 PHP : Stop output to screen

mysql - 如何优化我的数据库?

Python POST 字符串数据

Python:将文件分块上传到服务器,包括附加字段

python - 传入 cookie python 请求

HTTP 分块编码。需要 SPEC 中提到的 'Trailer' 的示例

ssl - 从 Go 服务器发送分块的 HTTPS 响应

xml - ASP错误: msxml3. dll错误80070005,访问被拒绝。如何设置正确的权限?

geoserver - 使用 XML (GeoServer) 的 PHP Post WMS GetMap 请求

spring-mvc - 如何在 Spring MVC 中代理 HTTP 请求?