向 Dropbox 发出请求有什么问题?

What's wrong with a request to Dropbox?

我拥有 Dropbox 帐户 (API v2)、Delphi 7 和 Indy 10 的有效访问令牌。 当我尝试使用此令牌时出现异常 'HTTP/1.1 400 Bad Request'。 我看着 Dropbox API v2 无法理解: 请求有什么问题?

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;

新代码与 header,错误相同:-(。 根据 Indy: Request 指定要发送到 HTTP 服务器的 header 值。

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;

您正在尝试将授权数据放入请求 URL 和请求 body .您应该将其放在请求 headers 中。使用 TIdHTTP.Request.CustomHeaders 属性 发送自定义 Authorization header 值,例如:

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;