HTTPRequest
La clase HTTPRequest
permite manejar objetos HTTPRequest
que se pueden utilizar para configurar y enviar solicitudes a un servidor HTTP, así como para procesar las respuestas del servidor HTTP.
La clase HTTPRequest
está disponible en el class store 4D
. Para crear y enviar peticiones HTTP se utiliza la función 4D.HTTPRequest.new(), que devuelve un objeto HTTPRequest
.
Historia
Lanzamiento | Modificaciones |
---|---|
19 R6 | Clase añadida |
Ejemplo
Crear una clase MyHttpRequestOptions
para las opciones de la petición:
Class constructor($method : Text; $headers : Object; $body : Text)
This.method:=$method
This.headers:=$headers
This.body:=$body
Function onResponse($request : 4D.HTTPRequest; $event : Object)
// Mi método onResponse, si quiere manejar la petición de forma asíncrona
Function onError($request : 4D.HTTPRequest; $event : Object)
// Mi método onError, si quiere manejar la petición de forma asíncrona
Ahora puede crear su petición:
var $headers : Object
$headers:=New object()
$headers["field1"]:="value1"
var myHttpRequestOptions : cs.MyHttpRequestOptions
myHttpRequestOptions := cs.MyHttpRequestOptions.new("GET"; $headers; "")
var $request : 4D.HTTPRequest
$request:=4D.HTTPRequest.new("www.google.com"; myHttpRequestOptions)
$request.wait() // Si desea gestionar la solicitud de forma sincrónica
// Ahora puede utilizar $request.response para acceder al resultado de la petición o $request.error para comprobar el error que se ha producido.
Objeto HTTPRequest
Un objeto HTTPRequest es un objeto no compartible.
Los objetos HTTPRequest ofrecen las siguientes propiedades y funciones:
agent : 4D.HTTPAgent el objeto agent pasado en options o el objeto agente global si se omitió |
dataType : Text el dataType pasado en el objeto options al llamar a new(), "auto" si se omitió |
encoding : Text el encoding pasado en el objeto options al llamar a new(), "UTF-8" si se omitió |
errors : Collection la colección de todos los errores si se ha generado al menos un error |
headers : Object los headers pasados en el objeto options al llamar a new() |
method : Text el method pasado en el objeto options al llamar a new() |
protocol : Text el protocol pasado en el objeto options al llamar a new() |
response : Object la respuesta a la solicitud si ha recibido al menos el código de estado, de lo contrario undefined |
returnResponseBody : Boolean el returnResponseBody pasado en el objeto options al llamar a new() |
.terminate() interrumpe la solicitud HTTP |
terminated : Boolean True si la solicitud es terminada (después de la llamada a onTerminate ), false de lo contrario |
timeout : Real el timeout pasado en el objeto options al llamar a new() |
url : Text la URL de la solicitud HTTP |
.wait( { time : Real } ) : 4D.HTTPRequest espera la respuesta del servidor |
4D.HTTPRequest.new()
Historia
Lanzamiento | Modificaciones |
---|---|
20 | Validación TLS por defecto |
19 R7 | Soporte de las propiedades automaticRedirections y decodeData |
4D.HTTPRequest.new( url : Text { ; options : Object } ) : 4D.HTTPRequest
Parámetros | Tipo | Descripción | |
---|---|---|---|
url | Text | -> | URL a la que enviar la solicitud |
options | Object | -> | Propiedades de configuración de la petición |
Result | 4D.HTTPRequest | <- | Nuevo objeto HTTPRequest |
Descripción
La función 4D.HTTPRequest.new()
crea y envía una solicitud HTTP al servidor HTTP definido en url con las opciones definidas, y devuelve un objeto 4D.HTTPRequest
.
El objeto HTTPRequest
devuelto se utiliza para procesar las respuestas del servidor HTTP y llamar a los métodos.
En url, pase la URL a la que desea enviar la petición. La sintaxis a utilizar es:
{http://}[{user}:[{password}]@]host[:{port}][/{path}][?{queryString}]
{https://}[{user}:[{password}]@]host[:{port}][/{path}][?{queryString}]
Si se omite la parte "scheme" (http://
o https://
), se envía una petición https.
Por ejemplo, puede pasar las siguientes cadenas:
http://www.myserver.com
www.myserver.com/path
http://www.myserver.com/path?name="jones"
https://www.myserver.com/login
http://123.45.67.89:8083
http://john:smith@123.45.67.89:8083
http://[2001:0db8:0000:0000:0000:ff00:0042:8329]
http://[2001:0db8:0000:0000:0000:ff00:0042:8329]:8080/index.html (**)
Parámetro options
En el parámetro options, pase un objeto que puede contener las siguientes propiedades:
Propiedad | Tipo | Descripción | Por defecto |
---|---|---|---|
agent | 4D.HTTPAgent | HTTPAgent a utilizar para la HTTPRequest. Las opciones del agente se fusionarán con las opciones de la petición (las opciones de la petición tienen prioridad). Si no se define un agente específico, se utiliza un agente global con valores predeterminados. | Objeto agente global |
automaticRedirections | Boolean | Si es true, las redirecciones se realizan automáticamente (se gestionan hasta 5 redirecciones, se devuelve la 6ª respuesta de redirección si la hay) | True |
body | Variant | Cuerpo de la petición (necesario en el caso de las peticiones post o put ). Puede ser un texto, un blob, o un objeto. El content-type se determina a partir del tipo de esta propiedad a menos que se defina dentro de los encabezados | indefinido |
certificatesFolder | Folder | Define la carpeta de certificados de cliente activa | indefinido |
dataType | Text | Tipo de atributo del cuerpo de la respuesta. Valores: "text", "blob", "object", o "auto". Si "auto", el tipo de contenido del cuerpo se deducirá de su tipo MIME (object para JSON, texto para texto, javascript, xml, mensaje http y formulario codificado en url, blob en caso contrario) | "auto" |
decodeData | Boolean | Si true, los datos recibidos en la retrollamada onData se descomprimen | False |
encoding | Text | Se utiliza sólo en caso de peticiones con un body (métodos post o put ). Codificación del contenido del cuerpo de la petición si es un texto, se ignora si se define content-type dentro de los encabezados | "UTF-8" |
headers | Object | Encabezados de la petición. Sintaxis: headers.key=value (value puede ser una colección si la misma llave debe aparecer varias veces) | Objeto vacío |
method | Text | "POST", "GET" u otro método | "GET" |
minTLSVersion | Text | Define la versión mínima de TLS: "TLSv1_0 ", "TLSv1_1 ", "TLSv1_2 ", "TLSv1_3 " | "TLSv1_2 " |
onData | Function | Retrollamada cuando se reciben los datos del cuerpo. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
onError | Function | Retrollamada cuando ocurre un error. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
onHeaders | Function | Retrollamada cuando se reciben los encabezados. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
onResponse | Function | Retrollamada cuando se recibe una respuesta. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
onTerminate | Function | Retrollamada cuando la petición haya terminado. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
protocol | Text | "auto" o "HTTP1". "auto" significa HTTP1 en la implementación actual | "auto" |
proxyAuthentication | objeto de autenticación | Autenticación del proxy de gestión de objetos | indefinido |
serverAuthentication | objeto de autenticación | Autenticación del servidor de gestión de objetos | indefinido |
returnResponseBody | Boolean | Si false, el cuerpo de la respuesta no se devuelve en el objeto response . Devuelve un error si es false y onData es undefined | True |
timeout | Real | Tiempo de espera en segundos. Indefinido = sin tiempo de espera | Indefinido |
validateTLSCertificate | Boolean | Si false, 4D no valida el certificado TLS y no devuelve un error si no es válido (es decir, caducado, autofirmado...). Importante: en la implementación actual, la propia Autoridad de Certificación no se verifica. | True |
Función callback (retrollamada)
Todas las funciones de retrollamada reciben dos parámetros objeto:
Parámetros | Tipo |
---|---|
$param1 | Objeto HTTPRequest |
$param2 | Objeto Event |
Esta es la secuencia de llamadas de retorno:
-
onHeaders
se llama siempre una vez -
onData
se llama cero o varias veces (no se llama si la petición no tiene cuerpo) -
Si no se ha producido ningún error,
onResponse
siempre se llama una vez -
Si se produce un error,
onError
se ejecuta una vez (y termina la petición) -
onTerminate
se ejecuta siempre una vez
Para que las funciones de retrollamada se llamen cuando no utilice wait()
(llamada asíncrona), el proceso debe ser un worker creado con CALL WORKER
, NO New process
.
objeto evento
Un objeto event
es devuelto cuando una función de callback es llamada. Contiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
---|---|---|
.data | blob | Datos recibidos. Siempre es undefined excepto en la retrollamada onData |
.type | text | Tipo de evento. Valores posibles: "response", "error", "headers", "data", o "terminate |
authentication object
Un objeto de autenticación maneja la propiedad options.serverAuthentication
o options.proxyAuthentication
. Puede contener las siguientes propiedades:
Propiedad | Tipo | Descripción | Por defecto |
---|---|---|---|
name | Text | Nombre usado para la autenticación | indefinido |
contraseña | Text | Contraseña utilizada para la autenticación | indefinido |
method | Text | Método utilizado para la autenticación: "basic", "digest", "auto" | "auto" |
HTTP Parse message
Historia
Lanzamiento | Modificaciones |
---|---|
20 R4 | Añadidos |
HTTP Parse message( data : Text ) : Object
HTTP Parse message( data : Blob ) : Object
Parámetros | Tipo | Descripción | |
---|---|---|---|
data | Text, Blob | -> | Datos a analizar |
Result | Object | <- | Objeto, cada propiedad es parte de los datos de varias partes |
Descripción
El comando HTTP Parse message
analiza un texto o un blob multipart/form-data (mensaje HTTP "response") y extrae el contenido a un objeto. Cada propiedad del objeto devuelto corresponde a una parte de los datos multiparte.
El propio HTTP es un protocolo de comunicación sin estado. En este marco, los clientes inician la comunicación enviando mensajes de "petición" a los servidores, especificando detalles como el método, el objetivo, los encabezados, el contenido, etc. Los servidores, a su vez, responden con mensajes de "respuesta" que incluyen los mismos detalles. HTTP Parse message
analiza el mensaje "request" o "response" en un objeto estructurado.
Ejemplo
En el siguiente ejemplo, analizamos los datos de un archivo de texto que contiene peticiones HTTP.
Este es el contenido del archivo:
POST /batch/gmail/v1/ HTTP/1.1
Accept-Encoding: gzip, deflate
Authorization: Bearer xxxxxx
Connection: Close
Content-Length: 442
Content-Type: multipart/mixed; boundary=batch_19438756D576A14ABA87C112F56B9396; charset=UTF-8
Date: Wed, 29 Nov 2023 13:51:35 GMT
Host: gmail.googleapis.com
User-Agent: 4D/20.4.0
--batch_19438756D576A14ABA87C112F56B9396
Content-Type: application/http
Content-ID: <item1>
GET https://gmail.googleapis.com/gmail/v1/users/me/messages/18c1b58689824c92?format=raw HTTP/1.1
--batch_19438756D576A14ABA87C112F56B9396
Content-Type: application/http
Content-ID: <item2>
GET https://gmail.googleapis.com/gmail/v1/users/me/messages/18c1b58642b28e2b?format=raw HTTP/1.1
--batch_19438756D576A14ABA87C112F56B9396--
Para analizar el archivo:
var $message : Text:=File("/RESOURCES/HTTPrequest.txt").getText()
var $parsedMessage : Object:=HTTP Parse message($message)
//$parsedMessage= {
//headers:{"User-Agent":"4D/20.4.0",...},
//parts:[{"contentType":"application/http","contentID":"item1",...}],
//requestLine:"POST /batch/gmail/v1/ HTTP/1.1"
//}
.agent
agent : 4D.HTTPAgent
Descripción
La propiedad .agent
contiene el objeto agent
pasado en options
o el objeto agente global si se omitió.
.dataType
dataType : Text
Descripción
La propiedad .dataType
contiene el dataType
pasado en el objeto options
al llamar a new(), "auto" si se omitió.
.encoding
encoding : Text
Descripción
La propiedad .encoding
contiene el encoding
pasado en el objeto options
al llamar a new(), "UTF-8" si se omitió.
.errors
errors : Collection
Descripción
La propiedad .errors
contiene la colección de todos los errores si se ha generado al menos un error.
Este es el contenido de la propiedad .errors
:
Propiedad | Tipo | Descripción | |
---|---|---|---|
errors | Collection | Pila de error 4D en caso de error | |
[].errCode | Number | Código de error 4D | |
[].message | Text | Descripción del error 4D | |
[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
.headers
headers : Object
Descripción
La propiedad .headers
contiene los headers
pasados en el objeto options
al llamar a new(). Si se omite, contiene un objeto vacío.
.method
method : Text
Descripción
La propiedad .method
contiene el method
pasado en el objeto options
al llamar a new(). .
.protocol
protocol : Text
Descripción
La propiedad .protocol
contiene el protocol
pasado en el objeto options
al llamar a new(). Si se ha omitido o si se ha utilizado "auto", contiene la versión del protocolo utilizada.
.response
Historia
Lanzamiento | Modificaciones |
---|---|
19 R8 | .headers devuelve los nombres en minúsculas. Nueva propiedad .rawHeaders |
response : Object
Descripción
La propiedad .response
contiene la respuesta a la solicitud si ha recibido al menos el código de estado, de lo contrario undefined.
Un objeto response
es un objeto no compartible. Ofrece las siguientes propiedades:
Propiedad | Tipo | Descripción |
---|---|---|
.body | Variant | Cuerpo de la respuesta. El tipo del mensaje se define según la propiedad dataType . Indefinido si el cuerpo no se ha recibido todavía |
.headers | Object | Encabezados de la respuesta. Los nombres de los encabezados se devuelven en minúsculas. <headername>.key = valor (el valor puede ser una colección si la misma llave aparece varias veces). Indefinido si el los encabezados no se ha recibido aún. |
.status | Number | Código de estado de la respuesta |
.statusText | Text | Mensaje explicando el código de estado |
.rawHeaders | Object | Encabezados de la respuesta. Los nombres de los encabezadoss se devuelven intactos (con sus mayúsculas y minúsculas originales). <headerName>.key = valor (el valor puede ser una colección si la misma llave aparece varias veces). Indefinido si el los encabezados no se ha recibido aún. |
.returnResponseBody
returnResponseBody : Boolean
Descripción
La propiedad .returnResponseBody
contiene el returnResponseBody
pasado en el objeto options
al llamar a new(). Si se omite, contiene True.
.terminate()
.terminate()
Parámetros | Tipo | Descripción | |
---|---|---|---|
No requiere ningún parámetro |
Descripción
Esta función es hilo seguro.
La función .terminate()
interrumpe la solicitud HTTP. Activa el evento onTerminate
.
.terminated
terminated : Boolean
Descripción
La propiedad .terminated
contiene True si la solicitud es terminada (después de la llamada a onTerminate
), false de lo contrario.
.timeout
timeout : Real
Descripción
La propiedad .timeout
contiene el timeout
pasado en el objeto options
al llamar a new(). .
.url
url : Text
Descripción
La propiedad .url
contiene la URL de la solicitud HTTP.
.wait()
.wait( { time : Real } ) : 4D.HTTPRequest
Parámetros | Tipo | Descripción | |
---|---|---|---|
time | Real | -> | Tiempo máximo en segundos para esperar la respuesta |
Result | 4D.HTTPRequest | <- | Objeto HTTPRequest |
Descripción
Esta función es hilo seguro.
La función wait()
espera la respuesta del servidor.
Si se pasa un parámetro time, la función esperará como máximo el número de segundos definido.
Si la respuesta del servidor ya ha llegado, la función regresa inmediatamente.
Durante una ejecución .wait()
, las funciones de retrollamada se ejecutan, ya sea desde otras instancias HTTPRequest
o SystemWorker
u otras llamadas CALL WORKER
. Puede salir de un .wait()
llamando a terminate()
desde un callback.