在 Delphi 中使用来自 Indy 的 GitHub API

Using GitHub API from Indy in Delphi

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

最初,我选择(一如既往)使用 Indy 与 GitHub API 集成。我一直将 Indy 用于所有网络 API 消费。但是,我在 GitHub.

中使用它没有任何成功

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

我已经设置了一个 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 建立连接?

此 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