2012-05-30 135 views
22

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

这里是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; 
+0

尝试查看如何使用Indy和SSL。我敢打赌你错过了OpenSSL库。 – TLama

+0

是什么让你认为错误意味着记录的意义以外的任何东西? “403:尝试进行无效的复制操作(例如,在给定目的地已经有文件,或将共享文件夹复制到共享文件夹中)。” –

+1

@Tlama,不会丢失SSL库也会干扰授权,上传和下载操作,据推测这些操作可行? –

回答

1

就在PARAMS在消息的正文复制,因为我知道有印使用时和不是在URL 尝试使用类似:

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

我不知道这是正确的语法,但是这是想法。

1

我想我可能在这里发现了什么错误。我不知道TOAuthRequest类,但我会猜测GetString方法给出了标准的OAuth头'Authorization Bearer {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); 

希望这有助于。

相关问题