HTTP/2 协议

适用于 Delphi 与 C++Builder 的原生 HTTP/2 客户端与服务端。二进制帧、流多路复用、HPACK 标头压缩与 ALPN 协商 — 无需依赖 IIS、Apache 或 Indy。

选择您需要的一端

两款生产可用的组件完整实现了 HTTP/2 (RFC 9113) 线路协议。使用客户端来消费 HTTP/2 API,使用服务端来发布它们 — 或者在同一个应用程序中同时使用两者。

TsgcHTTP2Client

原生 HTTP/2 客户端 — 在单条 TLS 连接上多路复用 GET/POST/PUT/DELETE 请求,HPACK 压缩的标头,通过 ALPN 升级 h2 或先验知识 h2c,处理服务器推送,并支持 bearer / basic / NTLM 认证。

打开 HTTP/2 客户端 →

TsgcWebSocketHTTPServer

原生 HTTP/2 服务端 — 同一个 WebSocket HTTP 服务端可在一个 TLS 端口上同时提供 HTTP/1.1、HTTP/2 (h2) 与 WebSocket 服务。包含 ALPN 协商、流多路复用、HPACK 响应以及可选的 RFC 8441 WebSocket over HTTP/2 引导。

打开 HTTP/2 服务端 →

sgcWebSockets 中的 HTTP/2

将 HTTP/2 帧处理一流地集成进客户端与 WebSocket HTTP 服务端。

组件

TsgcHTTP2Client
TsgcWebSocketHTTPServer

平台

Windows, macOS, Linux, iOS, Android

版本

客户端:Standard / Pro / Enterprise
服务端:Pro / Enterprise

HTTP/2 带来什么

HTTP/2 相对于 HTTP/1.1 的所有优势 — 以原生 Delphi/C++Builder 代码实现,无需启动独立的 Web 服务器。

二进制帧

请求与响应被拆分为二进制帧,由确定性状态机解析。不再有文本行解析或 HTTP/1.1 的歧义问题。

流多路复用

数十个在途请求共享单条 TCP/TLS 连接 — 在 HTTP 层无队头阻塞,无需为每个请求新建额外的套接字。

HPACK 标头压缩

内置 HPACK 编/解码器 (RFC 7541)。重复的 cookie、认证令牌与 content-type 标头在首次请求之后几乎不占用字节。

ALPN 协商

在 TLS 握手期间,对端会公告 h2http/1.1;协商出的 ALPN 值用于选择协议,且不浪费任何往返。

先验知识 h2c

对于可信的内部链路与服务网格 sidecar,双方可跳过 ALPN,通过 HTTP2_PriorKnowledge 直接基于明文启动 HTTP/2。

服务器推送

服务端可主动发送 PUSH_PROMISE 响应;客户端通过 OnHTTP2StreamData 暴露这些响应以便缓存。注意:在公共 Web 上已弃用,但在内部场景仍然有用。

流优先级

每流的优先级与依赖提示让关键响应(认证、导航、JSON-RPC 结果)能在同一连接上优先于大批量传输。

流量控制

每流与每连接的 WINDOW_UPDATE 流量控制能避免一个大响应饿死较小的响应 — 可通过 SETTINGS 帧调优。

通过 OpenSSL 或 SChannel 的 TLS

TLSOptions.IOHandler 设置为 iohSChannel 即可使用 Windows 内核 TLS(无需 DLL),或设置为 iohOpenSSL 以获得完整的跨平台 1.2/1.3 支持。

HTTP/2 大显身手之处

在以下场景中,HTTP/2 的多路复用与 HPACK 节省可立竿见影。

Apple 推送通知

Apple 的 APNs Provider API 要求使用 HTTP/2。TsgcHTTP2Client 端到端驱动 Apple Push 组件并支持基于令牌的认证。

Firebase 云消息

Google 的 FCM HTTP v1 API 运行在 HTTP/2 之上。同一组件为 FCM 提供动力,并支持服务账户 JWT 生成。

现代 REST 与 JSON API

大多数云 API(Stripe、GitHub、Cloudflare、Google、Azure…)默认使用 HTTP/2 — 多路复用客户端可降低并行调用的延迟。

服务到服务流量

位于 sidecar 网格之后的内部微服务通过 HTTP/2 先验知识 (h2c) 在同一个套接字上多路复用数百个 RPC 流。

同一端口上的 WebSocket + HTTP/2

TsgcWebSocketHTTPServer 在单一 TLS 端点上提供 HTTP/1.1、HTTP/2 与 WebSocket — ALPN 自动为每个连接路由。

RFC 8441 WebSocket over HTTP/2

对于倾向于在 HTTP/2 流内隧道 WebSocket 帧的客户端,可在服务端启用 Specifications.RFC8441

客户端与服务端,仅需几行代码

放下组件,设置 TLS,启动。握手期间 ALPN 会为您协商出 h2

uses
  sgcHTTP, sgcHTTP2;

var
  HTTP2: TsgcHTTP2Client;
begin
  HTTP2 := TsgcHTTP2Client.Create(nil);
  HTTP2.TLSOptions.IOHandler := iohSChannel; // 或 iohOpenSSL
  HTTP2.TLSOptions.Version   := tls1_2;

  // 添加自定义标头(由 HPACK 压缩)
  HTTP2.Request.CustomHeaders.Add('authorization: Bearer eyJ...');

  // 通过 HTTP/2 发送 GET(ALPN 协商 h2)
  Memo1.Text := HTTP2.Get('https://api.example.com/v1/items');
  ShowMessage(IntToStr(HTTP2.Response.Status));
end;
uses
  sgcWebSocket;

var
  Server: TsgcWebSocketHTTPServer;
begin
  Server := TsgcWebSocketHTTPServer.Create(nil);
  Server.Port := 443;
  Server.SSL  := True;
  Server.SSLOptions.CertFile := 'cert.pem';
  Server.SSLOptions.KeyFile  := 'key.pem';

  // HTTP/1.1、HTTP/2 与 WebSocket 共用同一 TLS 端口
  Server.Specifications.HTTP    := True;
  Server.Specifications.HTTP2   := True;
  Server.Specifications.RFC6455 := True;

  Server.Active := True;
end;
// uses: sgcHTTP, sgcHTTP2
TsgcHTTP2Client *HTTP2 = new TsgcHTTP2Client(this);
HTTP2->TLSOptions->IOHandler = iohSChannel;
HTTP2->Request->CustomHeaders->Add("authorization: Bearer eyJ...");
Memo1->Text = HTTP2->Get("https://api.example.com/v1/items");

规范与参考

这些组件所实现协议的权威来源。

文档与演示

直达组件页面、在线帮助以及试用版中自带的可直接运行演示项目。

HTTP/2 客户端 — TsgcHTTP2Client 组件页面:客户端的特性、代码示例与 TLS 选项。
HTTP/2 服务端 — TsgcWebSocketHTTPServer 组件页面:如何在同一 TLS 端口上与 HTTP/1.1 和 WebSocket 一起启用 HTTP/2。
在线帮助 — HTTP/2 HTTP/2 组件的完整属性、方法与事件参考。
演示项目 — Demos\20.HTTP_Protocol\01.HTTP2_Server_And_Client 可直接运行的示例项目。随 sgcWebSockets 包一同提供 — 请在下方下载试用版。
用户手册 (PDF) 涵盖库中每个组件的完整手册。

准备使用 HTTP/2 了吗?

下载免费试用版,为您的 Delphi 应用程序添加多路复用的 HTTP/2 客户端与服务端流量。