2012-05-30 2 views
22

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

Вот описание раздаточной апи: 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; 
+0

Попробуйте посмотреть, как использовать Indy с SSL. Готов поспорить, вам не хватает библиотек OpenSSL. – TLama

+0

Что заставляет вас думать, что ошибка означает нечто иное, чем документированное значение? 403: Была предпринята попытка выполнить недопустимую операцию копирования (например, уже есть файл в данном месте назначения или копирование общей папки в общую папку). " –

+1

@Tlama, не пропустили бы библиотеки SSL, также вмешиваются в авторизацию, загрузку и загрузку, которые предположительно работают? –

ответ

1

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

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

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

1

Я думаю, что я мог бы обнаружить, что здесь не так. Я не знаю класса TOAuthRequest, но я угадаю, что метод GetString дает стандартный заголовок OAuth «Знак авторизации (KEY)». Смотрите, что это заголовок и правильный способ, чтобы добавить его в запрос HTTP является

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

Вы с другой стороны добавить эту строку в орган, который может работать на получать запросы, потому что тело (строка авторизации) ошибочно для заголовка, но с методом 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); 

Надеется, что это помогает.

 Смежные вопросы

  • Нет связанных вопросов^_^