【问题标题】:What's wrong with a request to Dropbox?对 Dropbox 的请求有什么问题?
【发布时间】:2017-01-03 02:03:24
【问题描述】:

我拥有 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;

带有标题的新代码,错误相同:-(。 根据Indy: Request 指定要发送到 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;

【问题讨论】:

  • 授权不是请求的 URL 的一部分,但应该在 HTTP 标头中发送。
  • 谢谢你,罗尔德·范·多恩。我尝试使用 head,如下所示:code Head := 'Authorization: Bearer' + AccessToken;流:= TMemoryStream.Create; Stream.Write(头部,长度(头部));流。位置:= 0; IdHTTP.Request.Source := 流; Res := IdHTTP.Post(URL, Source); code 并没有成功。也许你有一个可行的例子?
  • 谢谢你,@Roald。
  • 我不熟悉 Delphi/Indy,但也许如果您分享您的最新代码和由此产生的错误,其他人会更有帮助。此外,请检查响应正文本身是否存在特定错误。
  • 谢谢@Greg 产生的错误一样:-(。我将代码添加到帖子中。

标签: delphi dropbox indy


【解决方案1】:

您正在尝试将授权数据放入请求 URL 和请求 body 中。您应该将其放在请求 headers 中。使用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;

【讨论】:

  • 非常感谢@Remy。我不需要任何参数 - 默认情况下。我试过这个,在这两种情况下都试过IdHTTP.Request.CustomHeaders.Add('Authorization: Bearer ' + AccessToken);和'HTTP/1.1 400 Bad Request'。
  • @OlegAdibekov 更仔细地阅读了 Dropbox 文档。 /list_folder 资源接受五个 JSON 参数作为输入,其中两个(pathrecursive)不是可选的。
  • 你是对的,@RemyLebeau。这个添加可以正常工作:Source.WriteString('{ "path": "" }');。谢谢。
  • @OlegAdibekov 我会改用Source := TStringStream.Create('{"path":""}');,正如我的回答所暗示的那样。
猜你喜欢
  • 1970-01-01
  • 2016-09-01
  • 2015-11-30
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 2013-11-20
相关资源
最近更新 更多