TsgcHTTP1Client es un componente no visual que hereda del componente Indy TIdHTTP y agrega algunas propiedades nuevas.
Este componente se encuentra en la unidad sgcHTTP.
Permite configurar cómo conectarse a servidores seguros SSL/TLS mediante el protocolo HTTP/1.
ALPNProtocols: lista de los protocolos ALPN que se enviarán al servidor.
RootCertFile: ruta al archivo de certificado raíz.
CertFile: ruta al archivo de certificado.
KeyFile: ruta al archivo de clave del certificado.
Password: si el certificado está protegido con una contraseña, configúrela aquí.
VerifyCertificate: si el certificado debe ser verificado, habilite esta propiedad. Use el evento OnSSLVerifyPeer para personalizar la verificación SSL.
VerifyDepth: es una propiedad Integer que representa el número máximo de enlaces permitidos al realizar la verificación del certificado X.509.
Versión: por defecto utiliza TLS 1.0. Si el servidor requiere una versión de TLS superior, puede seleccionarse aquí.
Preset: aplica un conjunto de valores predeterminados seguros en una sola asignación. Con tlspCustom (el valor predeterminado) cada opción conserva el valor configurado manualmente. Establecer tlspSecureDefaults habilita VerifyCertificate, eleva Version como mínimo a TLS 1.2 (cuando se había configurado una versión inferior o sin definir) y habilita la verificación del nombre de host del certificado del servidor.
Proxy: aquí puede definir si desea conectarse a través de un servidor Proxy; puede conectarse a los siguientes servidores proxy:
pxyHTTP: Servidor Proxy HTTP.
pxySocks4: Servidor Proxy SOCKS4.
pxySocks4A: Servidor Proxy SOCKS4A.
pxySocks5: Servidor proxy SOCKS5.
IOHandler: seleccione la biblioteca que utilizará para conectarse mediante TLS.
iohOpenSSL: utiliza la biblioteca OpenSSL y es el valor predeterminado para los componentes Indy. Requiere desplegar las bibliotecas OpenSSL para win32/win64.
iohSChannel: utiliza Secure Channel, un protocolo de seguridad implementado por Microsoft para Windows. No requiere desplegar librerías OpenSSL. Solo funciona en Windows de 32/64 bits.
OpenSSL_Options: configuración de las bibliotecas OpenSSL.
APIVersion: permite definir qué API de OpenSSL se utilizará.
oslAPI_1_0: utiliza API 1.0 de OpenSSL, la última versión compatible con Indy
oslAPI_1_1: utiliza la API 1.1 de OpenSSL, requiere nuestra biblioteca Indy personalizada y permite usar las bibliotecas OpenSSL 1.1.1 (con soporte para TLS 1.3).
oslAPI_3_0: usa la API 3.0 de OpenSSL, requiere nuestra biblioteca Indy personalizada y permite usar las bibliotecas OpenSSL 3.0.0 (con soporte TLS 1.3).
LibPath: aquí puede configurar dónde se encuentran las bibliotecas OpenSSL
oslpNone: es el valor predeterminado. Las bibliotecas OpenSSL deben encontrarse en la misma carpeta que el binario o en una ruta conocida.
oslpDefaultFolder: establece automáticamente la ruta de OpenSSL donde deben estar ubicadas las bibliotecas para todas las personalidades del IDE.
oslpCustomFolder: si esta es la opción seleccionada, defina la ruta completa en la propiedad LibPathCustom.
LibPathCustom: cuando LibPath = oslpCustomFolder, defina aquí la ruta completa donde se encuentran las bibliotecas OpenSSL.
UnixSymLinks: habilita o deshabilita la carga de SymLinks en sistemas Unix (por defecto está habilitado, excepto en OSX64):
oslsSymLinksDefault: de forma predeterminada, los enlaces simbólicos están habilitados excepto en OSX64 (macOS Monterey y versiones posteriores fallan al intentar cargar la biblioteca sin versión).
oslsSymLinksLoadFirst: cargar los enlaces simbólicos primero, antes de intentar cargar las bibliotecas versionadas.
oslsSymLinksLoad: carga los enlaces simbólicos después de intentar cargar las bibliotecas versionadas.
oslsSymLinksDontLoad: no carga los SymLinks.
MinVersion: establezca aquí la versión mínima que utilizará el cliente para conectarse a un servidor seguro. De forma predeterminada, el valor es tlsUndefined, lo que significa que la versión mínima es la misma que se ha establecido en la propiedad Version. Ejemplo: si desea que el cliente se conecte únicamente usando TLS 1.2 o TLS 1.3, establezca los siguientes valores.
SSLOptions.Version := tls1_3;
SSLOptions.OpenSSL_Options.MinVersion := tls1_2;
X509Checks: utilice esta propiedad para habilitar validaciones adicionales del certificado X509:
Mode: seleccione qué opciones se validarán
oslx509chHostName: verifica el certificado del nombre de host.
oslx509chIPAddress: verifica la dirección IP del certificado.
HostName: establezca el nombre de host si es diferente al de la solicitud.
IPAddress: establezca la dirección IP si es diferente de la de la solicitud.
SChannel_Options: permite usar un certificado del almacén de certificados de Windows.
CertHash: es el Hash del certificado. Puede encontrar el Hash del certificado ejecutando un comando dir en powershell.
CipherList: aquí puede establecer qué cifrados se utilizarán (separados por ":"). Ejemplo: CALG_AES_256:CALG_AES_128
CertStoreName: el nombre del almacén donde está guardado el certificado. Seleccione una de las siguientes opciones:
scsnMY (el predeterminado)
scsnCA
scsnRoot
scsnTrust
CertStorePath: la ruta del almacén donde se guarda el certificado. Seleccione una de las siguientes opciones:
scspStoreCurrentUser (el valor predeterminado)
scspStoreLocalMachine
Si la propiedad Log está habilitada, guarda los mensajes del socket en un archivo de registro especificado, lo que resulta útil para la depuración.
LogOptions.FileName: ruta completa al nombre del archivo.
Permite autenticarse mediante OAuth2 o JWT.
Reintenta automáticamente las solicitudes HTTP fallidas usando backoff exponencial con jitter opcional. Los reintentos están deshabilitados por defecto, por lo que el comportamiento no cambia a menos que Enabled se establezca en true. Una solicitud se reintenta cuando el código de estado de la respuesta está en StatusCodes o cuando se produce un error de red transitorio (conexión cerrada, error de socket, tiempo de espera de conexión o de lectura).
Enabled: habilita el reintento automático de las solicitudes fallidas. Por defecto false.
MaxRetries: número máximo de reintentos después de la solicitud inicial. Por defecto 3.
InitialInterval: retardo en milisegundos antes del primer reintento. Por defecto 500.
MaxInterval: retardo máximo en milisegundos entre reintentos. Por defecto 30000.
Multiplier: factor aplicado al retardo después de cada intento. Por defecto 2.0, lo que duplica el retardo en cada reintento: 500, 1000, 2000...
Jitter: factor aleatorio entre 0 y 1 aplicado a cada retardo (0.2 varía cada retardo hasta un 20%), lo que evita que muchos clientes reintenten exactamente al mismo tiempo. Por defecto 0.2.
HonorRetryAfter: cuando el servidor responde con una cabecera Retry-After (en segundos o como fecha HTTP, normalmente con una respuesta 429 o 503), el cliente espera el tiempo solicitado por el servidor en lugar del retardo de backoff calculado. Por defecto true.
StatusCodes: lista separada por comas de los códigos de estado HTTP que provocan un reintento. Por defecto "429,502,503,504".
Ejemplo: reintentar hasta 5 veces, comenzando con 1 segundo entre intentos.
oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.RetryOptions.Enabled := True;
oHTTP.RetryOptions.MaxRetries := 5;
oHTTP.RetryOptions.InitialInterval := 1000;
ShowMessage(oHTTP.Get('https://www.esegece.com'));
Los clientes de proveedores de IA (OpenAI, Anthropic, Gemini y el resto de clientes de APIs LLM) usan este mismo motor de reintentos a través de la propiedad RetryOptions de sus Options.
De forma predeterminada, HTTP1Client utiliza solicitudes bloqueantes, por lo que tras llamar a un método de solicitud HTTP, el cliente espera la respuesta del servidor. Como alternativa, puede utilizar métodos asíncronos para ejecutar estas solicitudes HTTP en un hilo secundario, evitando bloquear el hilo donde se realiza la llamada. Se implementan los siguientes métodos asíncronos:
Tras llamar a estos métodos, en lugar de esperar la respuesta, el código continúa a la siguiente línea, y la respuesta puede gestionarse usando el evento OnAsyncResponse.
procedure OnAsyncResultEvent(Sender: TObject; const aRequest:
TsgcHTTPAsyncRequest; const aResponse: TIdHTTPResponse);
Si se produce algún error al procesar la solicitud asíncrona, la excepción se lanzará en el evento OnAsyncException.
En Delphi 2010 y posteriores, el cliente también implementa solicitudes asíncronas de estilo future que no requieren ningún controlador de eventos:
function GetFuture(const AURL: string): IsgcFuture<string>;
function PostFuture(const AURL: string; aData: TStream): IsgcFuture<string>;
La solicitud se ejecuta en un hilo en segundo plano y el future devuelto se resuelve con el cuerpo de la respuesta: llame a Await para bloquear hasta que llegue la respuesta, a ThenProc para consumirla en una continuación y a OnError para gestionar los fallos. Llamar a Cancel aborta la solicitud HTTP subyacente en lugar de dejar que se ejecute hasta el final.
oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.GetFuture('https://www.esegece.com')
.ThenProc(procedure(const aBody: string)
begin
Log(aBody);
end)
.OnError(procedure(E: Exception)
begin
Log(E.Message);
end);
Solicita un método GET al servidor HTTPs usando TLS 1.2
oHTTP := TsgcHTTP1Client.Create(nil);
Try
oHTTP.TLSOptions.Version := tls1_2;
ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
oHTTP.Free;
End;
Realice una solicitud con el método GET al servidor HTTPs usando openSSL 1.1 y TLS 1.3
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;
Solicite un método POST asíncrono y lea la respuesta usando el 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);
Solicitar un método GET al servidor HTTPs usando SChannel para Windows.
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;
Solicitar el método SSE para obtener eventos de datos
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
El evento se activa cuando se recibe un nuevo mensaje SSE.
OnSSLVerifyPeer
Si la verificación del certificado está habilitada, en este evento puede verificar y decidir si acepta el certificado del servidor.
OnSSLGetHandler
Este evento se activa antes de que se cree el controlador SSL. Puede crear su propio controlador SSL aquí (debe heredar de TIdServerIOHandlerSSLBase o TIdIOHandlerSSLBase) y establecer las propiedades necesarias.
OnSSLAfterCreateHandler
Si no se ha creado ningún objeto SSL personalizado, se crea uno predeterminado utilizando el controlador OpenSSL. Puede acceder a las propiedades del controlador SSL y modificarlas si es necesario.
OnAsyncResult
El evento se llama después de solicitar un método asíncrono (usando los métodos GetAsync, PutAsync...). Use el parámetro Response para conocer el resultado de la solicitud.
OnAsyncException
Si se produce algún error al procesar una solicitud asíncrona, este evento se llama con la excepción generada.