urllib3有ResponseNotChunked("Response is not chunked. ""Header 'transfer-encoding: chunked' is missing.")报错是怎么回事
发布时间:2025-04-07 13:05:58
urllib3出现ResponseNotChunked异常的原因是服务器响应缺少'transfer-encoding: chunked'头部,解决方法是确保服务器正确设置这个头部。示例代码中使用urllib3发送GET请求并处理响应,避免出现异常。
问题原因
urllib3出现ResponseNotChunked("Response is not chunked. ""Header 'transfer-encoding: chunked' is missing.")的原因通常是因为服务器返回的响应没有包含"transfer-encoding: chunked"头部字段,而urllib3默认会期望响应采用chunked传输编码。 在HTTP协议中,分块传输编码(chunked transfer encoding)允许服务器将响应分割成一系列数据块,并且可以动态生成响应内容而不需要知道内容的总长度。当服务器响应没有使用这种编码方式,但urllib3却期望得到分块编码的响应时,就会触发ResponseNotChunked异常。
解决方案
问题出现的原因是urllib3期望接收到一个分块传输的响应,但实际上并没有收到这样的响应。解决方法是确保服务器在响应中包含了正确的Transfer-Encoding: chunked
头部,以指示响应是分块传输的。如果服务器没有正确设置这个头部,就会导致这个错误。可以通过以下示例代码来正确使用urllib3进行请求,同时确保服务器发送正确的响应:
import urllib3
http = urllib3.PoolManager()
response = http.request('GET', 'http://example.com')
print(response.data)
在这个代码示例中,首先创建了一个urllib3.PoolManager
对象来处理HTTP请求,然后发出一个GET请求到http://example.com
。在这个过程中,urllib3会自动处理响应,包括检查响应是否是分块传输的。如果服务器正确设置了Transfer-Encoding: chunked
头部,就不会出现ResponseNotChunked
的错误。
具体例子
urllib3出现ResponseNotChunked("Response is not chunked. ""Header 'transfer-encoding: chunked' is missing.")的原因是服务器返回的响应中缺少了 'transfer-encoding: chunked' 头部,而urllib3在处理响应时期望看到这个头部来确认响应是分块传输的。 解决这个问题的方法是在构建请求时,显式指定response_kw
参数并将其设置为 {'preload_content': False}
。这样做可以告诉urllib3不要预先加载响应内容,而是等待实际需要响应内容时再去加载。
下面是一个正确使用urllib3处理这个问题的例子:
import urllib3
http = urllib3.PoolManager()
url = 'http://example.com/api'
response = http.request('GET', url, response_kw={'preload_content': False})
if response.status == 200:
data = response.data
# 在需要时处理响应内容,如打印、解析等
else:
print('Failed to get response')
response.release_conn()