使用 Google Drive API 更新文件时遇到 404 错误

我看到这个问题被问了几次,但没有一个答案是有帮助的。除非是一个 '用户权限' 的问题,在这种情况下我不知道如何处理。

上下文

  • 创建了一个新文件(来自 Lua 应用,因此使用 REST)
    • 使用了 ?uploadType=resumable
    • 从返回值中,捕获了 responseHeaders['X-GUploader-UploadID'] 和 response['id'],两者结果相同
  • 文件存在,可以在 Google Drive 上看到

然后,尝试更新,但我得到了 404 Not Found。这是 Lua 代码:

代码

local url = "https://www.googleapis.com/upload/drive/v3/files"

[userStateID 是上面捕获的 id]

url = url..'/'.._G.lobal.userStateID..'/?uploadType=media'
url = url..'/?uploadType=media\u0026upload_id='.._G.lobal.userStateID

[我尝试了上面的两种变化,结果相同]

resbody = stuff

local headers = {['Content-type'] = "application/json",
  Authorization=oauth,
  ['user-agent'] = "SilkRoad "+_G.VERSION,
  ['X-Upload-Content-Type']='application/text; charset=utf-8',
  ['Content-Length']=string.len(resbody)
}
local params = {headers=headers,body=resbody}
network.request(url, "PUT", uploadListener, params )

[Lua 中的异步网络调用]

结果

{"responseHeaders":{"Content-Type":"text/html; charset=UTF-8","X-GUploader-UploadID":"ABg5-UxILyJZKOABmdvQ2tDrsXrRTHY-pljfWSk67vcKyzcSoR28BoMjHG5gFi0a3GLUPVSU3T5bBvqlnK5qG0-lNEOc0Tp4vQ","Vary":"Origin, X-Origin","Date":"Sun, 30 May 2021 20:52:17 GMT","Alt-Svc":"h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"","Content-Length":"9","Server":"UploadServer"},"responseType":"text","phase":"ended","bytesEstimated":9,"response":"Not Found","name":"networkRequest","bytesTransferred":9,"status":404,"url":"https://www.googleapis.com/upload/drive/v3/files/?uploadType=media\u0026upload\_id=ABg5-UxG8zBq7ARLKAd7cE0FB2z9NG1Sv8gKlnH\_QjDqluSOaun5oRRI3h7fXHHn1KqEW1DolBkMmh4GlgwgOGl9NOc","isError":false,"requestId":"<type 'userdata' is not supported by JSON.>"}

没有 '用户' 来赋予权限。但也许要使用这种机制,更新任何应用程序创建的文件,我必须请用户进入其驱动器并更改权限? 这听起来不对。也许在元数据上需要放置一个标志?

'X-GUploader-UploadID' 没有文档,但如果我使用 response['id'],结果相同。我已经验证了在 Google Drive 中的 id(用于共享)与返回的 response['id'] 相同。但在更新时会显示“未找到”。

顺便说一下,只是尝试通过重新使用恢复 URL 或此变化来更新:

https://www.googleapis.com/upload/drive/v3/files?upload\_id=...

有一个奇怪的结果:没有错误,但文件没有更新。

使用 PATCH 而不是 PUT 在原始更新上也有一个奇怪的效果--没有错误,但将文件更新为空。所以也许那是秘密,但我必须弄清楚如何正确传递正文?

点赞
用户9749633
用户9749633

已解决。我需要:

  • 对更新使用可恢复方法(分成两个部分)
  • 在 URL 中添加 fileID(按照文档要求)
  • 对元数据更新使用 PATCH 方法
  • 对内容更新使用 PUT 方法

当然,至少对于 REST API,需要更好的文档或示例。

2021-05-31 03:43:49