rest - 在 Delphi 中使用来自 Indy 的 GitHub API

标签 rest delphi ssl github indy

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

最初,我选择(一如既往)使用 Indy 与 GitHub API 集成。我一直将 Indy 用于所有 Web 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

关于rest - 在 Delphi 中使用来自 Indy 的 GitHub API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56436568/

相关文章:

java - 无法启动 Grizzly http 服务器

javascript - 当 rest api 应用程序服务器(express)和 Angulars js 应用程序在不同端口上运行时出现 Cors 问题

delphi - 如何确定 Omni Thread Library 主线程不响应的原因?

delphi - 关于创建 "container"组件的建议

delphi - Indy 10 的 IdSSLIOHandlerSocketOpenSSL 导致 Delphi 5 崩溃

ruby-on-rails - 如何在不支付 SSL 证书的情况下避免 Heroku 托管站点(使用 Rails 构建)上的 SSL 错误

java - 如何从 Java 生成、签署和导入 SSL 证书

java - 将正文添加到 404 Not Found 异常

Qt SSL : Handshake failed for requests made from QML

rest - Grails Spring Security REST被禁止使用403