2012-05-30 22 views
22

No parece que administre la copia de archivo que funciona con la API de Dropbox. Puedo autorizar con éxito a mi cliente, descargar y cargar archivos. La operación de copia necesita el método POST para ser utilizado y creo que aquí es donde produzco una solicitud incorrecta. Estoy definiendo el Método POST para Autenticación OAuth y uso Indy TIdHTTP para Publicar la solicitud, pero siempre recibo el código de error 403 - Permiso denegado.Cómo copiar archivos usando API REST DropBox en Delphi

Aquí está la descripción de dropbox api: https://www.dropbox.com/developers/reference/api#fileops-copy

aquí es parte de mi código:

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

Intenta ver cómo usar Indy con SSL. Apuesto a que te faltan las bibliotecas OpenSSL. – TLama

+0

¿Qué te hace pensar que el error significa algo más que el significado documentado? "403: se intentó una operación de copia no válida (por ejemplo, ya hay un archivo en el destino determinado o copia una carpeta compartida en una carpeta compartida)." –

+1

@Tlama, ¿no faltarían las bibliotecas SSL que también interfieren con las operaciones de autorización, carga y descarga, que supuestamente funcionan? –

Respuesta

1

Por lo que yo sé cuando se utiliza con indy los parametros se copian en el cuerpo del mensaje y no en la url trate de usar algo como:

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

no estoy seguro de que esta es la sintaxis correcta, pero esa es la idea.

1

Creo que podría descubrir qué está mal aquí. No estoy al tanto de la clase TOAuthRequest, pero supongo que el método GetString da el encabezado estándar de OAuth 'Authorization Bearer {KEY}'. Ver que es cabecera y de la manera correcta para añadirlo a la petición HTTP es

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

Usted, por otra parte añadir que cadena en el cuerpo que puede funcionar para peticiones GET porque el cuerpo (la cadena de autorización) se equivoca para un encabezado pero con el método POST tiene cuerpo real antes de la cadena de autorización y, por lo tanto, se ignora la cadena OAuth.

Y, por último, no creo que necesite los parámetros de cadena en el cuerpo también. Un cuerpo vacío debería funcionar bien. La cadena de consulta parece estar bien.

código Ejemplo:

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

la esperanza de que esto ayude.