【问题标题】:Using GitHub API from Indy in Delphi在 Delphi 中使用 Indy 的 GitHub API
【发布时间】:2019-10-19 13:15:05
【问题描述】:

我正在开发一个与 GitHub 集成的 Delphi 10.1 Berlin 项目。该项目打算通过 ZIP 文件下载存储库。但是,我遇到了一些问题。

最初,我选择(一如既往)使用 Indy 与 GitHub API 集成。我一直将 Indy 用于所有 Web API 消费。但是,我在 GitHub 上使用它没有任何成功。

API 需要 HTTPS。我已经获得了用于 Indy 的最新 OpenSSL DLL,并且正在使用带有 Delphi 10.1 Berlin 的 Indy 库。

我设置了一个 TIdHTTP 组件,并附加了一个 TIdSSLIOHandlerSocketOpenSSL。我已将该 IO 处理程序设置为所有可用的Method 选项,但没有一个给我有效的响应。我得到了两种不同的回应之一...

  1. 当使用sslvSSLv3时,我得到:error:14094410:SSL routines: SSL3_READ_BYTES:sslv3 alert handshake failure.
  2. 当使用sslvTLSv1_2,我得到:error:1409442E:SSL routines:SSL_READ_BYTES:tlsv1 alert protocol version

我现在不得不求助于TRESTClient 才能使用 API。但它不能正确处理二进制。

测试就像https://api.github.com 一样简单。我可以在 Chrome 和 Postman 中调用它,然后得到响应。只是不是通过 Indy。

如何通过 Delphi 的 Indy 库与 GitHub 的 API 建立连接?

【问题讨论】:

  • 您应该使用 IOHandler 的 SSLVersions 属性而不是其 Method 属性。尝试将SSLVersions 设置为[sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]

标签: rest delphi ssl github indy


【解决方案1】:

这个 Indy HTTP 子类与 GitHub API 一起使用。

type
  TIndyHttpTransport = class(TIdCustomHTTP)
  public
    constructor Create;
  end;

implementation

uses
  IdSSLOpenSSL;

{ TIndyHttpTransport }

constructor TIndyHttpTransport.Create;
var
  SSLIO: TIdSSLIOHandlerSocketOpenSSL;
begin
  inherited Create;

  HTTPOptions := HTTPOptions + [hoNoProtocolErrorException, hoWantProtocolErrorContent];

  SSLIO := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
  SSLIO.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
  SSLIO.SSLOptions.Mode        := sslmClient;
  SSLIO.SSLOptions.VerifyMode  := [];
  SSLIO.SSLOptions.VerifyDepth := 0;

  Self.IOHandler := SSLIO;

  // Request.UserAgent := 'my useragent string';

end;

也许您的代码还需要修改用户代理字符串(因为我将此代码用于不同的服务提供商,而不仅仅是 GitHub。其中一些需要修改的用户代理字符串而不是默认值)。

来源:https://github.com/michaelJustin/daraja-framework/blob/master/demo/common/IndyHttpTransport.pas

【讨论】:

  • 谢谢,这是选择所有 3 个 TLS 版本和用户代理的组合。
  • 澄清一下,[sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2] 解决了我的直接问题,但后来我遇到了一个新问题,然后通过更改用户代理字符串解决了这个问题。在不改变这一点的情况下,我收到了一个错误页面 (HTML),告诉我我对该网站的访问受到限制(起初我很害怕我因尝试失败太多而杀死了我的访问令牌)。
猜你喜欢
  • 2014-06-27
  • 2012-05-04
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
相关资源
最近更新 更多