我一直试图找到请求模块对压缩的默认行为,但我无法找到任何东西,所以我问在这里:请求模块和压缩
是否模块询问请求服务器的默认压缩,还是不是?我们是否必须在标题中指定它?
我发现了一个页面在这里谈论的urllib,它是说,头必须要求压缩得到它:
http://www.diveintopython.net/http_web_services/gzip_compression.html
是它的要求是一回事吗?
我一直试图找到请求模块对压缩的默认行为,但我无法找到任何东西,所以我问在这里:请求模块和压缩
是否模块询问请求服务器的默认压缩,还是不是?我们是否必须在标题中指定它?
我发现了一个页面在这里谈论的urllib,它是说,头必须要求压缩得到它:
http://www.diveintopython.net/http_web_services/gzip_compression.html
是它的要求是一回事吗?
对于请求:具有正文(例如POST)的请求在默认情况下不会压缩其主体,因为很少有服务器会支持该主体。
对于响应:默认情况下,它接受(通过请求标头)压缩和未压缩的响应。通过通常的方式设置Accept-Encoding
标题可以覆盖此项。如果将Accept设置为仅允许压缩,如果服务器不支持压缩,则服务器可能无法为您的请求提供服务。
你可以自己测试一下。请尝试以下操作:
import requests
req = requests.get("http://google.com")
print(req.request.headers)
这将打印发送到服务器的标头(缺省标签,因为没有定义其他标头)。在我的系统我得到:
{'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.7.0 CPython/2.7.8 Linux/4.1.8-100.fc21.x86_64'}
所以,gzip
和deflate
被接受的压缩类型。服务器将选择其中之一。
好的,我有两个答案,告诉我头指定它接受压缩数据。但是如果服务器可以提供压缩和未压缩的数据,它会选择什么? – Rififi
@Rififi你正在想错误的方式:客户端(任何客户端)都可以列出接受的编码。之后,*服务器*决定使用哪种编码。强制压缩响应的唯一方法是只在Accept标头中压缩列表。但是,如果服务器不想使用压缩,请求将失败。 – Kroltan
是的,抱歉,如果我不清楚,那正是我的问题:服务器如何在编码中选择?假设你告诉它你接受压缩和未压缩的数据,它会选择什么(一般情况下)? – Rififi