2017-01-02 6 views
1

У меня есть действующий токен доступа к учетной записи Dropbox (API v2), Delphi 7 и Indy 10. Когда я пытаюсь использовать этот токен, у меня есть исключение «HTTP/1.1 400 Bad Request». Я смотрю Dropbox API v2 и не могу понять: Что случилось с запросом?Что случилось с запросом Dropbox?

procedure TDropboxSaveFilterForm.TestButtonClick(Sender: TObject); 
const 
    AccessToken = 'Hq7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; 
var 
    IdHTTP: TIdHTTP; 
    Source: TStringList; 
    Res, URL: WideString; 
begin 
    Source := TStringList.Create; 
    IdHTTP := TIdHTTP.Create(nil); 
    IdHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP); 
    URL := 'https://api.dropboxapi.com/2/files/list_folder' + '?' + 
     'Authorization=Bearer ' + AccessToken; 
    Res := IdHTTP.Post(URL, Source); 
    Source.Free; 
end; 

Новый код с заголовком, ошибка тот же :-( По Indy:. Запрос Определяет значения заголовка для отправки на сервер HTTP

procedure TDropboxSaveFilterForm.TestHeaderButtonClick(Sender: TObject); 
const 
    AccessToken = 'Hq7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; 
    URL = 'https://api.dropboxapi.com/2/files/list_folder'; 
var 
    IdHTTP: TIdHTTP; 
    Source: TStringList; 
    Head, Res: WideString; 
    Stream: TMemoryStream; 
begin 
    Source := TStringList.Create; 
    IdHTTP := TIdHTTP.Create(nil); 
    IdHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP); 
    Head := 'Authorization: Bearer ' + AccessToken; 
    Stream := TMemoryStream.Create; 
    Stream.Write(Head, Length(Head)); 
    Stream.Position := 0; 
    IdHTTP.Request.Source := Stream; 
    Res := IdHTTP.Post(URL, Source); 
    Source.Free; 
end; 
+3

Авторизация не является частью запрошенного URL-адреса, но должна быть отправлена ​​в заголовках HTTP. –

+0

Спасибо, Роальд ван Доорн. Я пробовал использовать голову, вот так: 'code' Глава: = 'Авторизация: Носитель' + AccessToken; Поток: = TMemoryStream.Create; Stream.Write (Head, Length (Head)); Stream.Position: = 0; IdHTTP.Request.Source: = Stream; Res: = IdHTTP.Post (URL, источник); 'code' и не имеют успеха. Может, у вас есть рабочий пример? –

+0

Спасибо, @ Roald. –

ответ

3

Вы пытаетесь поставить. данные авторизации в запросе URL и в запросе тел. Вы должны поместить его в запрос заголовки. Используйте свойство TIdHTTP.Request.CustomHeaders для отправки таможни Authorization значение заголовка, например:

procedure TDropboxSaveFilterForm.TestHeaderButtonClick(Sender: TObject); 
const 
    AccessToken = 'Hq7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; 
    URL = 'https://api.dropboxapi.com/2/files/list_folder'; 
var 
    IdHTTP: TIdHTTP; 
    Source: TStringStream; 
    Res: String; 
    Stream: TMemoryStream; 
begin 
    Source := TStringStream.Create('JsonParamsHere'); 
    try 
    IdHTTP := TIdHTTP.Create(nil); 
    try 
     IdHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP); 
     IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + AccessToken; 
     IdHTTP.Request.BasicAuthentication := False; 
     IdHTTP.Request.ContentType := 'application/json'; 
     Res := IdHTTP.Post(URL, Source); 
    finally 
     IdHTTP.Free; 
    end; 
    finally 
    Source.Free; 
    end; 
end; 
+0

Спасибо большое, @Remy. Мне не нужны никакие Параметры - все по умолчанию. Я попробовал это и попробовал 'IdHTTP.Request.CustomHeaders.Add ('Авторизация: Bearer' + AccessToken);' и 'HTTP/1.1 400 Bad Request' в обоих случаях. –

+1

@OlegAdibekov прочитал Документ Dropbox более тщательно. Ресурс '/ list_folder' берет пять параметров JSON в качестве входных данных, два из которых (' path' и 'recursive') НЕ являются необязательными. –

+1

Вы правы, @RemyLebeau. Он работает нормально с этим добавлением:' Source.WriteString ('{"path": ""}'); '. Спасибо. –