2012-05-30 7 views
22

Ich scheine nicht zu verwalten die Dateikopie Betrieb mit der Dropbox API. Ich kann meinen Kunden erfolgreich autorisieren, Dateien herunterladen und hochladen. Der Kopiervorgang benötigt die POST-Methode und ich denke, dass ich hier eine falsche Anfrage erzeuge. Ich definiere die POST-Methode für die OAuth-Authentifizierung und benutze Indy TIdHTTP, um die Anfrage zu posten, bekomme aber immer den Fehlercode 403 - Permission denied.Wie kopiert man Dateien mit Hilfe der DropBox REST API in Delphi

Hier ist die Dropbox api Beschreibung: https://www.dropbox.com/developers/reference/api#fileops-copy

Hier ist ein Teil meines Codes ist:

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

Versuchen Sie sich umzusehen, wie Sie Indy mit SSL verwenden. Ich wette, dass Sie die OpenSSL-Bibliotheken vermissen. – TLama

+0

Was lässt Sie denken, dass der Fehler etwas anderes als die dokumentierte Bedeutung bedeutet? "403: Ein ungültiger Kopiervorgang wurde versucht (z. B. gibt es bereits eine Datei am angegebenen Ziel oder einen freigegebenen Ordner in einen freigegebenen Ordner kopiert)." –

+1

@Tlama, würde nicht fehlen SSL-Bibliotheken stören auch Autorisierung, Upload und Download-Operationen, die angeblich funktionieren? –

Antwort

1

Soweit ich weiß, wann mit indy mit der params im Körper der Nachricht kopiert und nicht in der uRL versuchen, etwas mit wie:

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

ich bin nicht sicher, dass dies die richtige Syntax ist, aber das ist die Idee.

1

Ich denke, ich könnte hier entdeckt was falsch ist. Ich bin mir der TOAuthRequest-Klasse nicht bewusst, aber ich vermute, dass die GetString-Methode den Standard-OAuth-Header 'Authorization Bearer {KEY}' liefert. dass sehen ist Header und der richtige Weg, um es in der HTTP-Anforderung hinzuzufügen, ist

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

Sie auf der anderen Seite die Zeichenfolge an den Körper hinzufügen, die für Get-Anfragen arbeiten können, weil der Körper (die Genehmigung string) irrt für einen Header, aber mit der POST-Methode haben Sie tatsächlichen Körper vor der Autorisierungszeichenfolge und damit die OAuth Zeichenfolge wird ignoriert.

Und schließlich glaube ich nicht, dass Sie die Parameter-Zeichenfolge im Körper auch brauchen. Ein leerer Körper sollte gut funktionieren. Die Abfragezeichenfolge scheint OK zu sein.

Beispielcode:

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); 

Hoffnung, dass dies hilft.