Clases HTTP: Una nueva forma de realizar peticiones HTTP asíncronas

Traducido automáticamente de Deepl

En nuestro constante esfuerzo por mejorar la sintaxis y las funcionalidades de 4D, hemos decidido traerle nuevos comandos para realizar peticiones HTTP en 4D: las clases HTTP. Están disponibles desde 4D v19 R6 y presentarán muchas mejoras en las próximas versiones. Permítame mostrarle cómo usarlas de inmediato.

Las nuevas clases HTTP de HDI en acción

Petición simple

La sintaxis básica para enviar una petición HTTP es muy simple:

$request:=4D.HTTPRequest.new($url).wait()
If ($request.response#Null)
	// The code to handle the request response.
Else
	// The code to handle errors.
End if

La llamada a 4D.HTTPRequest.new instala la petición y la envía. El resultado de la petición será recuperado dentro del atributo response de la HTTPRequest.
A estas alturas, todos os preguntaréis qué hace ahí esta llamada a wait. Las nuevas clases HTTP están pensadas para ser utilizadas de forma asíncrona. No necesitas crear un proceso específico para alojar tu petición; ahora puedes enviar una petición en medio de un método sin bloquearlo. Pero si quieres mantener el antiguo comportamiento síncrono, puedes hacer una llamada a wait para esperar a que la petición se complete.

Petición asíncrona

Ahora, veamos cómo hacer una petición genuinamente asíncrona:

$request:=4D.HTTPRequest.new($url) 
// The code that will be executed while the request is not complete.

If ($request.terminated) // Is the request complete?
	If ($request.response#Null)
		// The code to handle the request response.
	Else
		// The code to handle errors.
	End if
End if

Aquí está, simple. Ahora puedes ejecutar tu código mientras se envía tu petición y, por tanto, beneficiarte de un rendimiento óptimo.

Petición asíncrona con callbacks

El último ejemplo será un poco más complicado. La nueva sintaxis le permite manejar peticiones a través de callbacks. Normalmente, escribirás una nueva clase para manejar tu HTTPRequest:

Class constructor()

Function onResponse($request : 4D.HTTPRequest)
// The code to handle the request response.

Function onError($request : 4D.HTTPRequest)
// The code to handle errors.

Y luego usará esta clase para manejar automáticamente sus peticiones:

$callbacks:=cs.myClassToHandleHTTPRequests.new()
$request:=4D.HTTPRequest.new($url; $callbacks)

No es necesario manejar la solicitud en su método; el resultado de la solicitud será manejado gracias a los callbacks onResponse y onError tan pronto como una respuesta esté disponible. Sólo tienes que tener cuidado con una cosa: las llamadas de retorno son llamadas en el mismo proceso que tu método. Se perderá el resultado de la petición si se mata el proceso antes de que se llamen. Asegúrate al final de tu método de comprobar que todas las peticiones se han completado.

Ejemplo

Para el último ejemplo, veamos una situación real. Solicitaremos una API REST de Trivia y enviaremos una pregunta aleatoria al usuario. Aquí está la clase para manejar la solicitud:

Class constructor()

Function onResponse($request : 4D.HTTPRequest)
If ($request.response.status=200)
	ALERT("Question: "+String($request.response.body[0].question))
	ALERT("Answer: "+String($request.response.body[0].answer))
Else 
	This.onError($request)
End if 

Function onError($request : 4D.HTTPRequest)
ALERT("Error when loading the question")

Y entonces puedes enviar tu petición:

$callbacks:=cs.TriviaRequestClass.new()
$request:=4D.HTTPRequest.new("http://jservice.io/api/random"; $callbacks)

¡Diviértete respondiendo a las preguntas del trivial al azar!

¿Cómo puedo?

Bonito tiempo en Francia hoy

Para ilustrar esta función, he aquí un ejemplo de demostración que interroga a un servicio REST de previsión meteorológica. Verá todas estas diferentes peticiones en acción para proporcionarle la mejor previsión meteorológica siempre que viva en Francia (o tenga previsto viajar a ese país).

Esta es la primera entrada del blog sobre las nuevas clases HTTP, ¡seguro que esta es una de una larga serie ya que pronto se publicarán nuevas funcionalidades HTTP!

Como siempre, si tiene algún comentario, no dude en compartirlo con nosotros en el foro oficial de 4D.

Nicolas Brachfogel
• Propietario de producto y Desarrollador Senior - Nicolas Brachfogel se unió a 4D en 2017 como Senior Developer (4D Server y networking). Como Product Owner para gestionar el lanzamiento de Apple Silicon, está a cargo de escribir historias de usuario y traducirlas en especificaciones funcionales, así como asegurarse de que las implementaciones de las funcionalidades satisfagan las necesidades del cliente. Diplomado por el Instituto Superior de Informática Aplicada (INSIA), Nicolas comenzó su carrera como desarrollador de software en 2001. Tras varios años codificando en Java y C++, pasó a especializarse en el desarrollo cliente-servidor para empresas de videojuegos. Como desarrollador/arquitecto de servidores, trabajó con éxito en las arquitecturas de servidores de muchos juegos (Dofus Arena, Drakerz, Trivial Pursuit Go!).