2012-05-30 7 views
22

Nie wydaje mi się, żebym zarządzał operacją kopiowania plików za pomocą interfejsu API Dropbox. Mogę z powodzeniem autoryzować mojego klienta, pobierać i przesyłać pliki. Operacja kopiowania wymaga użycia metody POST i myślę, że to tutaj generuję niewłaściwe żądanie. Definiuję metodę POST do uwierzytelniania OAuth i używam Indy TIdHTTP do wysłania żądania, ale zawsze otrzymuję kod błędu 403 - Odmowa uprawnień.Jak kopiować pliki za pomocą interfejsu API REST DropBox w Delphi

Oto opis Dropbox API: https://www.dropbox.com/developers/reference/api#fileops-copy

Tutaj jest częścią mojego kodu:

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

Spróbuj rozejrzeć się, jak korzystać z Indy z SSL. Założę się, że brakuje ci bibliotek OpenSSL. – TLama

+0

Co sprawia, że ​​uważasz, że błąd oznacza coś innego niż udokumentowane znaczenie? "403: Podjęto próbę nieważnego kopiowania (np. Już istnieje plik w danym miejscu docelowym lub kopiowanie folderu współdzielonego do folderu współdzielonego)." –

+1

@ Tlama, czy biblioteki biblioteki SSL nie ominą również operacji autoryzacji, przesyłania i pobierania, które rzekomo działają? –

Odpowiedz

1

O ile mi wiadomo, kiedy korzystając z indy params są kopiowane w treści wiadomości oraz nie w url spróbuj coś takiego:

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

nie jestem pewien, że to jest właściwa składnia ale to jest pomysł.

1

Myślę, że mogłem odkryć, co jest nie tak. Nie jestem świadomy klasy TOAuthRequest, ale domyślam się, że metoda GetString podaje standardowy nagłówek OAuth "Authorization Bearer {KEY}". Zobacz, że jest nagłówek i we właściwy sposób, aby dodać go do żądania HTTP jest

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

Ty natomiast dodać, że ciąg do organu, który może pracować dla żądań GET, ponieważ organizm (ciąg autoryzacja) jest błędne dla nagłówka, ale z metodą POST masz rzeczywistą treść przed ciągiem autoryzacji , a zatem łańcuch OAuth jest ignorowany.

I na koniec nie sądzę, żebyś potrzebował również ciąg parametrów w ciele. Pusty korpus powinien działać dobrze. Łańcuch zapytania wydaje się być OK.

Przykładowy kod:

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

nadzieję, że to pomaga.