在我使用的配置中,一个托管文件的 minio 服务器,仅接受 GET 请求,不接受 HEAD 请求。我需要标头信息来检查文件类型以避免获取整个文件。
我通常会使用
requests.head(url)
来完成此操作,但是正如我之前提到的,只允许使用 GET 方法。
在curl中可以执行以下操作:
curl -I -X GET http://domain.dom/path/
它会卷曲 url 的标头,但会使用 GET HTTP 方法覆盖所使用的方法。 Python3
requests
包有等效的东西吗?
不幸的是,似乎没有一种干净的方法可以做到这一点。如果服务器接受
Range
标头,您可以尝试请求从 0 到 0 的字节,这样您就可以访问标头数据,但不能访问正文。例如
import requests
url = "http://stackoverflow.com"
headers = {"Range": "bytes=0-0"}
res = requests.get(url, headers=headers)
print(res.headers)
如上所述,这仍然取决于服务器的实现。供参考:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range
基于 GET 的定义,听起来您可以修改请求标头以包含范围请求。
A client can alter the semantics of GET to be a "range request", requesting transfer of only some part(s) of the selected representation, by sending a Range header field in the request (Section 14.2).
我还没有尝试过这个,但也许设置 0-1 的字节范围会跳过正文,并且您可以免费获得标头。
Range
标头并不总是可靠,如果不支持,它将下载整个响应。
而是使用
stream=True
和 requests.close()
url = "http://exsmple"
headers = {"Range": "bytes=0-100"}
resp = requests.get(url, headers=headers, stream=True)
print(resp.headers)
resp.close()
如果
Range
支持,它将下载标头+ 101字节的正文
如果
Range
不支持,则只能下载 10 kb 或更少