是否可以使用requests.get命令只获取header而不获取body?服务器阻塞了 HEAD

问题描述 投票:0回答:3

在我使用的配置中,一个托管文件的 minio 服务器,仅接受 GET 请求,不接受 HEAD 请求。我需要标头信息来检查文件类型以避免获取整个文件。

我通常会使用

requests.head(url)
来完成此操作,但是正如我之前提到的,只允许使用 GET 方法。

在curl中可以执行以下操作:

curl -I -X GET http://domain.dom/path/

它会卷曲 url 的标头,但会使用 GET HTTP 方法覆盖所使用的方法。 Python3

requests
包有等效的东西吗?

python curl python-requests http-headers
3个回答
2
投票

不幸的是,似乎没有一种干净的方法可以做到这一点。如果服务器接受

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


1
投票

基于 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 的字节范围会跳过正文,并且您可以免费获得标头。


0
投票

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 或更少

© www.soinside.com 2019 - 2024. All rights reserved.