delphi oauth indy dropbox-api

Cómo copiar archivos usando DropBox REST API en Delphi



oauth indy (2)

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}''. Vea que es el encabezado y la forma correcta de agregarlo a la solicitud http es

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

Por otro lado, agrega esa cadena al cuerpo que puede funcionar para Obtener solicitudes porque el cuerpo (la cadena de autorización) se confunde con un encabezado pero con el método POST tienes cuerpo real antes de la cadena de autorización y, por lo tanto, se ignora la cadena OAuth .

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

Código de 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);

Espero que esto ayude

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.

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

Aquí está 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;


Por lo que sé al usar con indy los params se copian en el cuerpo del mensaje y no en la url, intente utilizar algo como:

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

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