TsgcHTTP1Client 是一个非可视组件,继承自 TIdHTTP Indy 组件并添加了一些新属性。
此组件位于 sgcHTTP 单元中。
允许您配置如何使用 HTTP/1 协议连接到安全 SSL/TLS 服务器。
ALPNProtocols:将发送给服务器的 ALPN 协议列表。
RootCertFile:根证书文件的路径。
CertFile:证书文件的路径。
KeyFile:证书密钥文件的路径。
Password:如果证书使用密码保护,请在此处设置密码。
VerifyCertificate:如果需要验证证书,请启用此属性。使用 OnSSLVerifyPeer 事件自定义 SSL 验证。
VerifyDepth:一个整数属性,表示对 X.509 证书执行验证时允许的最大链路数。
Version:默认使用 TLS 1.0。若服务器要求更高的 TLS 版本,可在此处选择。
代理:在此处您可以定义是否要通过代理服务器连接,可以连接到以下代理服务器:
pxyHTTP: HTTP 代理服务器。
pxySocks4:SOCKS4 代理服务器。
pxySocks4A:SOCKS4A 代理服务器。
pxySocks5:SOCKS5 代理服务器。
IOHandler:选择使用哪个库通过 TLS 进行连接。
iohOpenSSL:使用 OpenSSL 库,是 Indy 组件的默认选项。需要为 win32/win64 部署 OpenSSL 库。
iohSChannel:使用 Secure Channel,这是 Microsoft 为 Windows 实现的安全协议。无需部署 OpenSSL 库。仅适用于 Windows 32/64 位。
OpenSSL_Options:OpenSSL 库的配置。
APIVersion:允许定义将使用哪个 OpenSSL API 版本。
oslAPI_1_0: 使用 API 1.0 OpenSSL,这是 Indy 支持的最新版本
oslAPI_1_1:使用 OpenSSL API 1.1,需要我们定制的 Indy 库,并支持 OpenSSL 1.1.1 库(含 TLS 1.3 支持)。
oslAPI_3_0:使用 API 3.0 OpenSSL,需要我们的自定义 Indy 库,并允许使用 OpenSSL 3.0.0 库(支持 TLS 1.3)。
LibPath:在此配置 OpenSSL 库的所在路径
oslpNone:这是默认值。OpenSSL 库应位于与二进制文件相同的文件夹或已知路径中。
oslpDefaultFolder:自动为所有 IDE 类型设置 OpenSSL 库应所在的默认路径。
oslpCustomFolder: 如果选择此选项,请在属性 LibPathCustom 中定义完整路径。
LibPathCustom:当 LibPath = oslpCustomFolder 时,在此定义 OpenSSL 库所在的完整路径。
UnixSymLinks: 启用或禁用在 Unix 系统下加载符号链接(默认启用,OSX64 除外):
oslsSymLinksDefault:默认情况下,符号链接是启用的,但 OSX64 除外(macOS Monterey 及更高版本在尝试加载不带版本号的库时失败)。
oslsSymLinksLoadFirst:优先加载符号链接,然后再尝试加载带版本号的库。
oslsSymLinksLoad: 在尝试加载带版本的库之后加载符号链接。
oslsSymLinksDontLoad:不加载符号链接。
MinVersion:在此设置客户端连接到安全服务器所使用的最低版本。默认值为 tlsUndefined,表示最低版本与 Version 属性中设置的版本相同。示例:如果您希望客户端仅使用 TLS 1.2 或 TLS 1.3 连接,请设置以下值。
SSLOptions.Version := tls1_3;
SSLOptions.OpenSSL_Options.MinVersion := tls1_2;
X509Checks:使用此属性启用额外的 X509 证书验证:
Mode:选择要验证的选项
oslx509chHostName:验证主机名证书。
oslx509chIPAddress:验证证书的 IP 地址。
HostName:如果主机名与请求不同,请设置主机名。
IPAddress:若 IP 地址与请求不同,请设置该 IP 地址。
SChannel_Options:允许您使用 Windows 证书存储中的证书。
CertHash:是证书哈希值。您可以在 PowerShell 中运行 dir 命令找到证书哈希值。
CipherList:在此设置将使用的密码套件(以":"分隔)。示例:CALG_AES_256:CALG_AES_128
CertStoreName:证书存储的存储名称。请从以下选项中选择:
scsnMY(默认值)
scsnCA
scsnRoot
scsnTrust
CertStorePath:存储证书的存储区路径。请选择以下之一:
scspStoreCurrentUser(默认值)
scspStoreLocalMachine
如果启用了 Log 属性,它会将套接字消息保存到指定的日志文件中,便于调试。
LogOptions.FileName:文件的完整路径。
默认情况下,HTTP1Client 使用阻塞请求。或者,您可以使用异步方法在辅助线程中执行这些 HTTP 请求,避免阻塞调用请求的线程。实现了以下异步方法:
调用这些方法后,代码不会等待响应,而是继续执行下一行,响应可通过事件 OnAsyncResponse 处理。
procedure OnAsyncResultEvent(Sender: TObject; const aRequest:
TsgcHTTPAsyncRequest; const aResponse: TIdHTTPResponse);
如果在处理异步请求时发生任何错误,将在 OnAsyncException 事件中触发该异常。
向 HTTPS 服务器请求 GET 方法,并使用 TLS 1.2
oHTTP := TsgcHTTP1Client.Create(nil);
Try
oHTTP.TLSOptions.Version := tls1_2;
ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
oHTTP.Free;
End;
使用 openSSL 1.1 和 TLS 1.3 向 HTTPs 服务器发送 GET 请求
oHTTP := TsgcHTTP1Client.Create(nil);
Try
oHTTP.TLSOptions.OpenSSL_Options.APIVersion := oslAPI_1_1;
oHTTP.TLSOptions.Version := tls1_3;
ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
oHTTP.Free;
End;
请求一个异步 POST 方法,并使用 OnAsyncResultEvent 读取响应。
procedure OnAsyncExceptionEvent(Sender: TObject; const aThread:
TsgcThread; const E: Exception);
begin
Log(E.Message);
end;
procedure OnAsyncResultEvent(Sender: TObject; const aRequest:
TsgcHTTPAsyncRequest; const aResponse: TIdHTTPResponse);
begin
if aResponse.ResponseCode = 200 then
Log('ok', aRequest.Response)
else
Log('error', aRequest.Response);
end;
oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.OnAsyncResult := OnAsyncResultEvent;
oHTTP.OnAsyncException := OnAsyncResultEvent;
oRequest := TStringStream.Create('body');
oResponse := TStringStream.Create('');
oHTTP.PostAsync('https://localhost/test', oRequest, oResponse);
使用 Windows 的 SChannel 向 HTTPS 服务器发送 GET 请求。
oHTTP := TsgcHTTP1Client.Create(nil);
Try
oHTTP.TLSOptions.IOHandler := iohSChannel;
oHTTP.TLSOptions.Version := tls1_2;
ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
oHTTP.Free;
End;
请求 SSE 方法以获取数据事件
oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.OnSSEMessage := OnSSEMessageEvent;
oHTTP.GetSSE('https://www.yoursite.com/sse');
procedure OnSSEMessageEvent(Sender: TObject; const aMessage: string; var Cancel: Boolean);
begin
ShowMessage(aMessage);
end;
OnSSEMessage
当接收到新的 SSE 消息时调用此事件。
OnSSLVerifyPeer
如果启用了证书验证,在此事件中您可以验证并决定是否接受服务器证书。
OnSSLGetHandler
在 SSL 处理程序创建之前触发此事件。您可以在此创建自己的 SSL 处理程序(需要继承自 TIdServerIOHandlerSSLBase 或 TIdIOHandlerSSLBase),并设置所需属性。
OnSSLAfterCreateHandler
如果未创建自定义 SSL 对象,则使用 OpenSSL 处理程序创建默认对象。您可以访问 SSL 处理程序属性并根据需要修改它们。
OnAsyncResult
请求异步方法(使用 GetAsync、PutAsync 等方法)后调用该事件。使用 Response 参数获知请求结果。
OnAsyncException
若在处理异步请求时发生任何错误,将触发此事件并传入所引发的异常。