您的位置:

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()