使用PATCH请求设置Google Storage对象自定义元数据遇405错误求助
Google Storage对象PATCH设置自定义元数据返回405的问题
根据Google Storage官方文档,理论上可使用PATCH请求为对象设置自定义元数据,但实际发送PATCH请求时,服务器返回405 Method Not Allowed响应,响应头Allow字段包含DELETE、GET、HEAD、OPTIONS、POST、PUT方法。
文档提到若代理不支持PATCH方法,可使用POST请求并添加X-Http-Method-Override: PATCH头,但尝试后仍得到相同的405 Method Not Allowed错误。
完整请求头
:authority: storage.googleapis.com :method: POST :path: /cloud-storage-manager-test-bucket/alice.png?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=sweetvine-testing-service-acco%40sweetvine-systems-infra.iam.gserviceaccount.com%2F20240424%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20240424T213255Z&X-Goog-Expires=3600&X-Goog-Signedheaders=host&x-goog-signature=0a068071f7e2ad6d3b725fded2f0fac6916d5c9481a9ce5c165b3b79b98bc6315653bd7ff034863a3edbc85147af3eba0edb532ac233834914d4e782c72770b2c504f4f08738aac7b6a184126a7ac8f2cb4f381da7be59c1cbb8e3017fd1cc1bd23ae5497ec13267de6c119db438589828a1542b8c8ab295be0b0d68bb0fe421f69dc72024b3b2997dd496d4edab79ec1ccbb3265031e3e5727ff27b60a422307deda1b67dc58e7eab5848e577cb4ddc0dd583c1b2daf3ffba7b41aa41944bd440c971cbad59f15d5fa4b7af3c43956f001a27ea84ae017f916372995b909d7b0a1f0dbc70100657d5125d66646ccf674ae7f74faa05e9ad2b86886f21171403 :scheme: https Accept: */* Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9 Cache-Control: no-cache Content-Length: 28 Content-Type: text/plain;charset=UTF-8 Origin: http://localhost:3000 Pragma: no-cache Referer: http://localhost:3000/ Sec-Ch-Ua: "Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121" Sec-Ch-Ua-Mobile: ?0 Sec-Ch-Ua-Platform: "macOS" Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: cross-site User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 X-Client-Data: <gibberish omitted> Decoded: <ClientVariations omitted> X-Http-Method-Override: PATCH
预检响应头
Access-Control-Allow-Headers: x-http-method-override Access-Control-Allow-Methods: GET,PUT,POST,PATCH,DELETE,HEAD,OPTIONS Access-Control-Allow-Origin: * Access-Control-Max-Age: 3600 Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Cache-Control: private, max-age=0 Content-Length: 0 Content-Type: text/html; charset=UTF-8 Date: Wed, 24 Apr 2024 21:32:55 GMT Expires: Wed, 24 Apr 2024 21:32:55 GMT Server: UploadServer X-Guploader-Uploadid: <numbers and letters>
请求负载
测试时希望将标签avatar设置为值true,请求负载为:
{"metadata":{"avatar":true}}
另外,控制台提示存在CORS违规,但预检请求返回了200(OK),这一现象不符合预期。
可能的原因分析
- 预签名URL与请求方法不匹配:你使用的是带签名的URL,但预签名URL是绑定请求方法的。如果要通过POST+
X-Http-Method-Override模拟PATCH,需要生成对应PATCH方法的预签名URL,而非POST方法的签名URL,否则服务器会拒绝请求。 - Content-Type不正确:你的请求Content-Type为
text/plain;charset=UTF-8,但PATCH(或方法覆盖的POST)请求的JSON负载需要设置Content-Type: application/json,服务器可能因格式不匹配返回405错误。 - CORS配置细节遗漏:虽然预检返回200,但检查CORS规则是否允许
application/json的Content-Type,若未配置可能导致实际请求触发CORS违规提示。 - 权限或元数据格式问题:虽然返回的是405,但少数情况下权限不足或元数据键不符合规则(如含特殊字符)也可能引发误导性状态码,不过
avatar属于合法键,此可能性较低。
内容的提问来源于stack exchange,提问作者gischer
相关产品推荐
相关产品推荐

