【问题标题】:Delphi's TNetHTTPClient descendant supporting http2Delphi 的 TNetHTTPClient 后代支持 http2
【发布时间】:2019-10-23 15:15:02
【问题描述】:

我正在尝试从 Delphi 10.3.1 Windows 客户端应用程序通过 gRPC 与 Google Cloud Speech 进行通信。为此,通信需要使用http2作为协议,数据需要2路异步传输。

Delphi 包含 TNetHTTPClient,它被 TNetHTTPRequest 用于 http 通信。使用调试器发现 System.Net.HttpClient.Win.pas 中的 TWinHTTPClient 是内部用于通信的。

为了添加对 http2 的支持,我在 System.Net.HttpClient.Win.pas 的 TWinHTTPClient.DoExecuteRequest 中插入了 2 行,第 1360 行:

    LOptionValue := 1;//WINHTTP_PROTOCOL_FLAG_HTTP2;
    WinHttpSetOption(LRequest.FWRequest, WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL, @LOptionValue, sizeof(LOptionValue));

添加上述代码后,组件使用的是http2,我通过gRPC调用Google Cloud Speech Sync Request端点成功验证。

但是,我的方法有两个主要缺点:

  1. 需要修改Delphi源码。
  2. 它不支持异步双向数据传输,对此我认为需要在不关闭连接的情况下触发 OnDataReceived 事件。

我试图找到一个可以将 TNetHTTPClient 替换为修改过的组件 TMyNetHTTPClient 的点,但我没有成功。

那么,问题来了:如何在TWinHTTPClient的基础上创建一个TNetHTTPClient替代品,它支持http2,并且在不关闭连接的情况下实现OnDataReceived事件?

【问题讨论】:

  • 如何创建一个基于 TWinHTTPClient 的 TNetHTTPClient 替代品,它支持 http2 并在不关闭连接的情况下实现 OnDataReceived 事件?” - 你不能。为什么不直接使用 WinHTTP API?
  • 那么,不可能创建一个 TNetHTTPClient 后代来实现所请求的功能吗?令我失望的是,Delphi 的 TNetHTTPRequest/TNetHTTPClient 似乎被设计为易于使用的 WinHTTP API 包装器。
  • 您可以创建后代。只需编写包装适当 WinHTTP 调用以支持 http2 的代码。是什么阻止你这样做?
  • 我无法创建 TWinHTTPClient 后代,因为它位于 System.Net.HttpClient.Win.pas 的实现部分。我试图创建一个 TNetHTTPClient 后代,但我无法用 TWinHttpClient.DoExecuteRequest 覆盖 DoExecuteRequest。
  • 基本上,阻止我的是:TNetHttpClient 和 TWinHTTPClient 之间的关系不明确。

标签: delphi grpc http2


【解决方案1】:

它不是基于 TNetHTTPClient,但 grijjy 已经为 Windows 和 Linux 开源了一个 HTTP2 Delphi 客户端。

你可以在这里找到它 - https://github.com/grijjy/DelphiScalableClientSockets

【讨论】:

    猜你喜欢
    • 2017-03-30
    • 2016-05-28
    • 2019-10-02
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2019-10-18
    • 2018-03-27
    相关资源
    最近更新 更多