TsgcHTTP3Client

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当请求或连接发生错误时触发。
OnConnectHTTP/3 连接建立后触发。
OnDisconnectHTTP/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;

系统要求