首页 > 解决方案 > `Content-Length` 和 `Transfer-Encoding` 有什么区别?urllib.request.urlopen

问题描述

我将使用 GitHub 网址下载。
但是,urlopen 接收到的值并不总是恒定的。

如果你运行下面的代码,

import urllib.request 

url = "https://github.com/PixarAnimationStudios/USD/archive/v20.11.zip"
u = urllib.request.urlopen(url)

meta = u.info()
print(u.headers.keys())
print(u.headers.get("Content-Type"))
print(u.headers.get("Transfer-Encoding"))
print(u.headers.get("Content-Length"))

情况1

['Date', 'Content-Type', 'Content-Length', 'Connection', 'Access-Control-Allow-Origin', 'Content-Disposition', 'Content-Security-Policy', 'ETag', 'Strict-Transport-Security', 'Vary', 'X-Content-Type-Options', 'X-Frame-Options', 'X-XSS-Protection', 'X-Varnish', 'Age', 'Via', 'X-Cache', 'X-Cache-Hits', 'Accept-Ranges', 'Vary', 'X-GitHub-Request-Id']
application/zip
None
30301735

案例2

['Date', 'Content-Type', 'Transfer-Encoding', 'Connection', 'Access-Control-Allow-Origin', 'Content-Disposition', 'Content-Security-Policy', 'ETag', 'Strict-Transport-Security', 'Vary', 'X-Content-Type-Options', 'X-Frame-Options', 'X-XSS-Protection', 'X-Varnish', 'Age', 'Via', 'X-Cache', 'X-Cache-Hits', 'Accept-Ranges', 'Vary', 'X-GitHub-Request-Id']
application/zip
chunked
None

Content-Length和 和有什么不一样Transfer-Encoding

我用python3.9

标签: python-3.xgithub

解决方案


Content-Length和 和有什么不一样Transfer-Encoding

一个告诉您响应的内容有多长(并且可能不存在),另一个告诉您响应是否使用其他方式发送而不是直接发送数据(并且可能不存在)。

在第一种情况下,您会看到使用chunked Transfer-Encoding服务器必须预先发送的方法Content-Length,以便您的客户端知道它已收到整个文件。

在第二个中,文件是用 发送的chunked,因此没有完整长度的预先声明,因此Content-Length被省略。内容的长度可以根据每个块的总和来确定。


推荐阅读