【问题标题】:How to send a HEAD HTTP request in Python to Amazon S3?如何在 Python 中向 Amazon S3 发送 HEAD HTTP 请求?
【发布时间】:2009-02-11 13:13:33
【问题描述】:

我正在尝试使用 Python 从 S3 资源中检索 HTTP HEAD 信息。不幸的是,响应总是返回 403 错误。我正在使用建议的代码 here 但不幸的是,这不适用于 S3 请求。下面是代码(主机和关键细节省略):

>>> import httplib
>>> conn = httplib.HTTPConnection("www.mybucket.us")
>>> conn.request("HEAD", "/mykey?myparamterers")
>>> res = conn.getresponse()
>>> res.status
>>> 403

请求还会发送一个签名过期作为查询字符串的一部分。

我也尝试过使用 httplib2,但 HEAD REQUEST 只是挂起。

【问题讨论】:

  • 用GET替换HEAD是否有效?

标签: http-headers amazon-s3 request amazon head


【解决方案1】:

如果您使用的是签名 URL,则该 URL 由方法(例如 HEAD 或 GET)签名。因此,每种方法都需要不同的 URL。

【讨论】:

    【解决方案2】:

    403 告诉您发送的请求是有效的(是否正确是另一回事),但由于某种原因您无权访问请求的页面。至少您知道正在发送一个有效的 HTTP 请求。

    你能检查一下服务器日志吗?这可能有助于阐明问题...

    我也不确定“HEAD”请求。你能不使用“GET”或“POST”并自己提取标题吗?可能是库没有实现“HEAD”......我不确定 - 我通过快速谷歌搜索能够找到的文档严重不足。

    【讨论】:

    • 执行 HEAD REQUEST 的原因是为了避免执行不必要的 GET。如果我在同一个 url 上执行 HTTP GET,我会得到 200 响应。这应该与 HTTP HEAD 相同。
    【解决方案3】:

    403 HTTP 代码表示禁止。可能是站点管理员禁用了此方法。

    尝试远程登录

    telnet www.mybucket.us 80
    HEAD http://www.mybucket.us/mykey?myparamterers
    Host: www.mybucket.us
    <ENTER>
    <ENTER>
    

    并观察服务器响应。

    或者,您可以在 python 代码中使用conn.set_debuglevel(1)

    【讨论】:

      【解决方案4】:

      针对 GET 生成的 AWS S3 预签名 URL 上的 HEAD 请求将导致 403 Forbidden 响应。但是,您可以通过使用 Range 标头设置如下的 GET 请求,在预签名的 AWS S3 URL 上实现等效的 HEAD 请求:

      Range: bytes=0-0

      这是一个代码sn-p

      import requests
      response = requests.get(download_url, headers={"Range": "bytes=0-0"})
      

      如屏幕截图所示,响应的正文为空,但包含听者信息。

      https://i.stack.imgur.com/9J99G.png

      【讨论】:

        猜你喜欢
        • 2010-09-11
        • 2019-10-20
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多