0

我正在为 Google 文档开发一个 delphi api,并且很难让上传工作。我在这里遵循谷歌的开发指南,据我了解,这个过程看起来应该是这样的:

  1. 对此 url: 发出 POST 请求,https://docs.google.com/feeds/upload/create-session/default/private/full/?access_token=my_access_token&v=3&convert=false带有这些标头:X-Upload-Content-TypeX-Upload-Content-Length
  2. 200 OK使用存储在Location标头中的下一个上传位置获取响应
  3. 向标头发出 PUT 请求,Location标头Content-Type设置为我X-Upload-Content-Type在步骤 1 中设置的任何内容,标头Content-Range设置为以下内容:bytes 0-524287/2097152以及正文中的前 512kb 数据
  4. 获取标头308 Resume Incomplete中包含下一个上传位置的响应Location
  5. 返回 3 直到所有字节都上传完毕,此时我将收到一个201 Created响应,其中包含描述我上传的文件的 xml 数据

包括第 3 步在内的一切工作正常。在第 4 步,事情开始出错。

最让我困惑的一件事是第 4 步的响应不包含Location标题。我认为这意味着我应该将下一个请求发送到相同的 url,但这会导致我收到 504 错误。我用 fiddler 尝试了整个过程,只是想看看是不是 delphi 代码,是我缺乏理解,还是谷歌正在做的事情。

这是我使用 fiddler 发送和接收的请求和响应:

POST https://docs.google.com/feeds/upload/create-session/default/private/full/?access_token=my_access_token&v=3&convert=false HTTP/1.1
Content-Type: application/x-www-form-urlencoded
X-Upload-Content-Type: application/octet-stream
X-Upload-Content-Length: 2097152
Content-Length: 0
Host: docs.google.com

HTTP/1.1 200 OK
Server: HTTP Upload Server Built on May 16 2012 12:03:24 (1337195004)
Location: https://docs.google.com/feeds/upload/create-session/default/private/full/?access_token=my_access_token&v=3&convert=false&upload_id=AEnB2Ur9-9VxMSI6kaFzbybY2qiyzK6kVoKzcZ6Yo02H8Ni4FlQFl_N06DdjZXzp3vSjOPH3CEb_4vDlKZp7VlC0hxpkypzlKg
Date: Tue, 22 May 2012 16:53:27 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Content-Length: 0
Content-Type: text/html

PUT https://docs.google.com/feeds/upload/create-session/default/private/full/?access_token=my_access_token&v=3&convert=false&upload_id=AEnB2Ur9-9VxMSI6kaFzbybY2qiyzK6kVoKzcZ6Yo02H8Ni4FlQFl_N06DdjZXzp3vSjOPH3CEb_4vDlKZp7VlC0hxpkypzlKg HTTP/1.1
Content-Type: application/octet-stream
Content-Length: 524288
Content-Range: bytes 0-524287/2097152
Host: docs.google.com
[first 512kb of data here]

HTTP/1.1 308 Resume Incomplete
Server: HTTP Upload Server Built on May 16 2012 12:03:24 (1337195004)
Range: bytes=0-524287
X-Range-MD5: bd9d4ee7afa24b7da0e685f05b5f1f44
Date: Tue, 22 May 2012 16:54:29 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Content-Length: 0
Content-Type: text/html

PUT https://docs.google.com/feeds/upload/create-session/default/private/full/?access_token=my_access_token&v=3&convert=false&upload_id=AEnB2Ur9-9VxMSI6kaFzbybY2qiyzK6kVoKzcZ6Yo02H8Ni4FlQFl_N06DdjZXzp3vSjOPH3CEb_4vDlKZp7VlC0hxpkypzlKg HTTP/1.1
Content-Type: application/octet-stream
Content-Length: 524288
Content-Range: bytes 524288-1048575/2097152
Host: docs.google.com
[next 512kb of data]

HTTP/1.1 504 Fiddler - Send Failure
Content-Type: text/html; charset=UTF-8
Connection: close
Timestamp: 10:54:14.056

我唯一能做的就是能够说一个事实,不仅仅是德尔福代码是错误的,而且因为我不认为它是谷歌,我将不得不和我一起去'不明白应该发生的事情。我错过了什么?

编辑

我能够让上传工作,我不完全确定我做了什么不同,但文档有点误导。至少对我来说是这样。当你发送一个 PUT 请求时,你不会得到一个新的位置,你只是继续上传到同一个位置。此外,当您完成上传时,201 响应不包含实际的 XML 数据,而是有一个Location标头,指向您可以从中获取 XML 数据的位置。没什么大不了的,但有点令人困惑。

4

1 回答 1

2

Fiddler 似乎返回了 504 错误,这两个链接应该会有所帮助:

http://urda.cc/blog/2010/09/28/iis-services-504s-and-fiddler/

http://urda.cc/blog/2010/09/30/follow-up-iis-services-504s-and-fiddler/

于 2012-05-22T18:17:48.887 回答