如何在 Delphi 中使用 DropBox REST API 复制文件

Posted

技术标签:

【中文标题】如何在 Delphi 中使用 DropBox REST API 复制文件【英文标题】:How to copy files using DropBox REST API in Delphi 【发布时间】:2012-06-04 21:42:23 【问题描述】:

我似乎没有使用 dropbox api 管理文件复制操作。我可以成功授权我的客户端,下载和上传文件。复制操作需要使用 POST 方法,我认为这是我产生错误请求的地方。 我正在为 OAuth 身份验证定义 POST 方法并使用 Indy TIdHTTP 发布请求,但我总是收到错误代码 403 - Permission denied。

这里是 Dropbox api 描述:https://www.dropbox.com/developers/reference/api#fileops-copy

这是我的代码的一部分:

 ParamStr := Format('root=%s&from_path=%s&to_path=%s', [Root, EncodeFileName(FromPath), EncodeFileName(ToPath)]);
 URL := 'https://api.dropbox.com/1/fileops/copy' + '?' + ParamStr;

 Consumer := TOAuthConsumer.Create(Key, Secret);
 AToken := TOAuthToken.Create(fToken, fTokenSecret);
 HMAC := TOAuthSignatureMethod_HMAC_SHA1.Create;
 ARequest := TOAuthRequest.Create('');
 try
  ARequest.HTTPURL := URL;
  ARequest.Method := 'POST';
  ARequest := ARequest.FromConsumerAndToken(Consumer, AToken, '');
  ARequest.Sign_Request(HMAC, Consumer, AToken);


  Params := TStringList.Create;
  try
   Params.Text := ParamStr + '&' + ARequest.GetString;
   HTTP.Post(URL, Params);
  finally
   Params.Free;
  end;

【问题讨论】:

试着看看如何使用 Indy 和 SSL。我敢打赌你错过了 OpenSSL 库。 是什么让您认为错误意味着除了记录的含义之外的任何其他含义? "403: 尝试了无效的复制操作(例如,给定目的地已经有文件,或者将共享文件夹复制到共享文件夹中)。" @Tlama,是否缺少 SSL 库也会干扰授权、上传和下载操作,这些操作应该可以正常工作? 我肯定有 SSL 库。正如我所说,它适用于所有 GET 和 PUT 方法 API。 没有同名的文件或文件夹,我已多次检查路径是否正确。我只是想复制一个文件。目标文件夹存在,源文件也存在。 【参考方案1】:

我想我可能会发现这里有什么问题。我不知道 TOAuthRequest 类,但我猜 GetString 方法提供了标准 OAuth 标头“授权承载 KEY”。看到那是标头,将其添加到 http 请求的正确方法是

HTTP.Request.CustomHeaders.AddValue('Authorization', <the rest of the string here>)

另一方面,您将该字符串添加到可能适用于 Get 请求的正文中,因为正文(授权字符串)被误认为是标头,但是使用 POST 方法,您在授权字符串之前有实际正文 因此 OAuth 字符串被忽略。

最后,我认为您也不需要正文中的参数字符串。一个空的身体应该工作得很好。查询字符串似乎没问题。

示例代码:

  ParamStr := Format('root=%s&from_path=%s&to_path=%s', [Root, EncodeFileName(FromPath), EncodeFileName(ToPath)]);
 URL := 'https://api.dropbox.com/1/fileops/copy' + '?' + ParamStr;

 Consumer := TOAuthConsumer.Create(Key, Secret);
 AToken := TOAuthToken.Create(fToken, fTokenSecret);
 HMAC := TOAuthSignatureMethod_HMAC_SHA1.Create;
 ARequest := TOAuthRequest.Create('');
 try
  ARequest.HTTPURL := URL;
  ARequest.Method := 'POST';
  ARequest := ARequest.FromConsumerAndToken(Consumer, AToken, '');
  ARequest.Sign_Request(HMAC, Consumer, AToken);



  HTTP.Request.CustomHeaders.AddValue('Authorization', <parsed ARequest.GetString>)
  HTTP.Post(URL);

希望这会有所帮助。

【讨论】:

【参考方案2】:

据我所知,在使用 indy 时,参数会复制到消息正文中,而不是 url 尝试使用类似的东西:

http:Post(URL+encodeparams(params));

我不确定这是正确的语法,但就是这样。

【讨论】:

以上是关于如何在 Delphi 中使用 DropBox REST API 复制文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vb.net 从 Dropbox 文件夹中复制 Dropbox 文件链接

Delphi XE5,如何将包中定义的框架放入组件调色板

如何配置 Git 以将其与 Dropbox 一起使用?

使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时

如何在 OSX 中使用 Dropbox 目录作为虚拟主机 Document Root?

使用 Dropbox API 列出 Dropbox 的所有文件夹和文件