TsgcHTTP3Client 是一个 HTTP/3 客户端(RFC 9114),通过 QUIC 发送 HTTP 请求,支持同步和异步请求方法。
TsgcHTTP3Client 按照 RFC 9114 定义实现了一个 HTTP/3 客户端。HTTP/3 通过 QUIC(一种内置 TLS 1.3 的基于 UDP 的传输协议)承载 HTTP 请求和响应,因此每个请求均通过加密、多路复用的连接发送,且不存在队头阻塞。客户端基于 OpenSSL 3.5 或更高版本提供的原生 QUIC 客户端构建,无需外部 HTTP/3 库。
组件可以同步发送请求(调用阻塞并返回响应体)或异步发送请求(调用立即返回,响应通过 OnResponse 事件传递)。
按照以下步骤发送同步请求:
1. 创建 TsgcHTTP3Client 的新实例,并设置服务器的 Host 和 Port。
2. 调用 Connect 打开 QUIC 连接,使用 Get(返回响应体)发送请求,并在完成后调用 Disconnect。示例:
oClient := TsgcHTTP3Client.Create(nil);
oClient.Host := 'www.example.com';
oClient.Port := 443;
oClient.Connect(oClient.Host, oClient.Port);
vResponse := oClient.Get('https://www.example.com/');
ShowMessage(vResponse);
oClient.Disconnect;
如需异步发送请求,请分配 OnResponse 事件并调用 GetAsync;调用立即返回,响应将通过事件传递。示例:
oClient := TsgcHTTP3Client.Create(nil);
oClient.OnResponse := OnResponseEvent;
oClient.GetAsync('https://www.example.com/');
procedure OnResponseEvent(Sender: TObject; const Response: TsgcHTTP3Response);
begin
ShowMessage(Response.DataString);
end;
| 名称 | 描述 |
|---|---|
| Host | 客户端将连接到的 HTTP/3 服务器的 IP 地址或 DNS 名称。 |
| Port | 用于连接到 HTTP/3(QUIC)服务器的 UDP 端口。 |
| ConnectTimeout | 客户端等待 QUIC 和 TLS 1.3 握手完成的最长时间(毫秒)。 |
| TLSOptions | 配置 QUIC 连接使用的 TLS 1.3 参数(证书、验证、ALPN)。 |
| Settings | 连接建立时向服务器通告的 HTTP/3 SETTINGS 参数。 |
| 名称 | 描述 |
|---|---|
| Connect | 打开 QUIC 连接并执行 TLS 1.3 和 HTTP/3 握手。 |
| Get | 发送同步 HTTP/3 GET 请求并返回响应体。 |
| Post | 发送携带正文负载的同步 HTTP/3 POST 请求。 |
| GetAsync | 发送非阻塞 HTTP/3 GET 请求;回复通过 OnResponse 传递。 |
| Disconnect | 关闭 HTTP/3(QUIC)连接。 |
| 名称 | 描述 |
|---|---|
| OnResponse | 当客户端收到来自服务器的完整响应(状态、头部和主体)时触发。 |
| OnError | 当请求或连接发生错误时触发。 |
| OnConnect | HTTP/3 连接建立后触发。 |
| OnDisconnect | HTTP/3 连接关闭后触发。 |
以下示例打开 HTTP/3 连接,发送 GET 和 POST 请求,然后关闭连接。
var
oClient: TsgcHTTP3Client;
vResponse: string;
begin
oClient := TsgcHTTP3Client.Create(nil);
try
oClient.Host := 'www.example.com';
oClient.Port := 443;
oClient.ConnectTimeout := 10000;
oClient.Connect(oClient.Host, oClient.Port);
if oClient.Connected then
begin
vResponse := oClient.Get('https://www.example.com/');
ShowMessage(vResponse);
vResponse := oClient.Post('https://www.example.com/api', 'name=value',
'application/x-www-form-urlencoded');
ShowMessage(vResponse);
end;
oClient.Disconnect;
finally
oClient.Free;
end;
end;
SGC_HTTP3 条件定义进行编译。sgcHTTP3_Client。TLSOptions.IOHandler = iohOpenSSL(默认)时,需要 OpenSSL 3.5 或更高版本,其提供最先支持原生 QUIC 的版本;此时引擎在 OpenSSL 加载时被检测:优先使用内置 OpenSSL QUIC 引擎,否则回退到 sgc QUIC 引擎。使用 TLSOptions.IOHandler = iohNativeTLS 时使用 sgc 引擎、原生 TLS 1.3 握手和原生报文保护,且不加载 OpenSSL。sgc 引擎同样会打开 HTTP/3 的控制流和 QPACK 流,并为后续请求复用同一条 QUIC 连接。