Google云端硬盘上传API可恢复REST会返回400 Bad Request

时间:2013-12-03 21:17:26

标签: rest google-drive-api

我正在尝试通过此链接关注google drive api的可恢复媒体上传。 https://developers.google.com/drive/manage-uploads#resumable

我的第一个请求很顺利,我在Location标题中找到了第二个url。 但是,当我在文档中给出第二个PUT调用时,它会抛出一个错误的请求。

Request 1: 

POST https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable

Request Header 1: 

Content-Type: application/json
Authorization: Bearer ya..
X-Upload-Content-Type: text/plain
X-Upload-Content-Length: 112
Host: www.googleapis.com
Content-Length: 112
Body 

{'title' : 'bravo122314.txt', 'mimeType': 'text/plain', 'parents' : [{'id': '0Bw5JasxEfsasa8NNsdU5dU123iVHc'}] } 


Response Header 1:
Location: https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable&upload_id=ASM
Date: Tue, 03 Dec 2013 21:07:40 GMT
Server: HTTP Upload Server Built on Nov 15 2013 16:02:54 (1384560174)
Content-Length: 0
Content-Type: text/html; charset=UTF-8

这是以下请求

Request 2: 
PUT https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable&upload_id=ASM

Request Header 2: 
Authorization: Bearer ya..
Content-Type: text/plain


Response 2:

{
"error":{
"errors":[
{
"domain":"global",
"reason":"badRequest",
"message":"Invalid Upload Request"
}
],
"code":400,
"message":"Invalid Upload Request"
}
}

以前有人遇到过这个问题吗?我错过了一些标题吗?

3 个答案:

答案 0 :(得分:1)

希望您现在已经解决了这个问题,但由于我刚开始尝试这样做,我会在这里添加一些个人调查结果。

向我跳出的第一件事X-Upload-Content-Length: 112应该是您PUT中要发送的文件的长度,而不是您第一次请求的长度。

我还需要在"Content-Encoding": "base64"中添加PUT作为标题,然后确保将blob编码为base64。我一直在javascript中这样做,所以我用btoa(reader.result)

包装我的FileReader结果

这两个标头都需要与Content-Type请求中的Content-LengthPUT标头相匹配:

X-Upload-Content-Type: text/plain
X-Upload-Content-Length: 112

出于安全原因,您无法在javascript请求中设置Content-Type,但浏览器应该能够处理该问题。

答案 1 :(得分:0)

尝试" uploadType"使用"媒体"确保可以先上传,然后尝试" resumable"?

PUT https://www.googleapis.com/upload/drive/v2/files/{id}?uploadType=media

请注意 id ,您可以看到参考号。

REF: How do I add/create/insert files to Google Drive through the API?

答案 2 :(得分:0)

在第二个请求中,您还需要设置Content-Length标头,它将如下所示:

Request 2: 
PUT https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable&upload_id=ASM

Request Header 2: 
Authorization: Bearer ya..
Content-Type: text/plain
Content-Length: 112

Request Body 2: 
{ bytes of file to upload }