Подтвердить что ты не робот

Как скопировать файлы с помощью DropBox REST API в Delphi

Кажется, я не управляю файловой копией, использующей dropbox api. Я могу успешно разрешить мой клиент, загрузить и загрузить файлы. Операция копирования требует использования метода POST, и я думаю, что это то, где я вызываю неправильный запрос. Я определяю метод POST для аутентификации OAuth и использую Indy TIdHTTP для отправки запроса, но всегда получаю код ошибки 403 - Permission denied.

Вот описание apbox dropbox: 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;
4b9b3361

Ответ 1

Насколько я знаю при использовании с indy параметры копируются в теле сообщения, а не в URL-адресе попробуйте использовать что-то вроде:

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

Я не уверен, что это правильный синтаксис, но эта идея.

Ответ 2

Думаю, я мог бы понять, что здесь не так. Я не знаю класса TOAuthRequest, но я угадаю, что метод GetString дает стандартный заголовок OAuth "Знак авторизации (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);

Надеюсь, что это поможет.