Classes HTTP : Une nouvelle façon d’effectuer des requêtes HTTP asynchrones

Traduit automatiquement de Deepl

Dans notre effort constant pour améliorer la syntaxe et les fonctionnalités de 4D, nous avons décidé de vous apporter de nouvelles commandes pour effectuer des requêtes HTTP dans 4D : les classes HTTP. Elles sont disponibles dès la version 19 R6 de 4D et bénéficieront de nombreuses améliorations dans les prochaines versions. Laissez-moi vous montrer comment les utiliser dès maintenant.

Les nouvelles classes HTTP de 4D en action

Requête simple

La syntaxe de base pour envoyer une requête HTTP est très 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

L’appel à 4D.HTTPRequest.new permet à la fois d’instancier la requête et de l’envoyer. Le résultat de la requête sera récupéré dans l’attribut response de la HTTPRequest.
À ce stade, vous vous demandez tous ce que cet appel à wait fait là. Les nouvelles classes HTTP sont destinées à être utilisées de manière asynchrone. Vous n’avez pas besoin de créer un processus spécifique pour accueillir votre requête ; vous pouvez désormais envoyer une requête au milieu d’une méthode sans la bloquer. Mais si vous souhaitez conserver l’ancien comportement synchrone, vous pouvez faire un appel à wait pour attendre la fin de la requête.

Demande asynchrone

Maintenant, voyons comment faire une demande véritablement asynchrone :

$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

Voilà, c’est simple. Vous pouvez maintenant exécuter votre code pendant l’envoi de votre requête et, ainsi, bénéficier de performances optimales.

Demande asynchrone avec callbacks

Le dernier exemple sera légèrement plus compliqué. La nouvelle syntaxe vous permet de gérer les requêtes par le biais de callbacks. Typiquement, vous écrirez une nouvelle classe pour gérer votre 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.

Et vous utiliserez ensuite cette classe pour gérer automatiquement vos requêtes :

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

Inutile de traiter la requête dans votre méthode, le résultat de la requête sera traité grâce aux callbacks onResponse et onError dès qu’une réponse sera disponible. Vous devez faire attention à une seule chose : les callbacks sont appelés dans le même processus que votre méthode. Vous manquerez le résultat de la requête si vous arrêtez le processus avant qu’ils ne soient appelés. Assurez-vous à la fin de votre méthode de vérifier que toutes vos requêtes ont été complétées.

Exemple

Pour le dernier exemple, examinons une situation réelle. Nous allons demander une API REST Trivia et soumettre une question aléatoire à l’utilisateur. Voici la classe qui traitera la demande :

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")

Et ensuite vous pouvez envoyer votre requête :

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

Amusez-vous à répondre à des questions aléatoires !

Comment puis-je

Beau temps en France aujourd’hui

Pour illustrer cette fonctionnalité, voici un exemple de démonstration interrogeant un service REST de prévisions météorologiques. Vous verrez toutes ces différentes requêtes en action pour vous fournir les meilleures prévisions météorologiques tant que vous habitez (ou prévoyez de voyager) en France.

Il s’agit du premier billet de blog sur les nouvelles classes HTTP, mais sachez que ce billet fait partie d’une longue série, car de nouvelles fonctionnalités HTTP seront bientôt disponibles !

Comme d’habitude, si vous avez des commentaires, n’hésitez pas à les partager avec nous sur le forum officiel de 4D.

Nicolas Brachfogel
- Product Owner & Senior Developer - Nicolas Brachfogel a rejoint 4D en 2017 en tant que développeur senior (4D Server et networking) et en tant que Product Owner pour gérer la mise en production d'Apple Silicon. Il est chargé de rédiger les user stories et de les traduire en spécifications fonctionnelles, ainsi que de s'assurer que les implémentations des fonctionnalités répondent aux besoins des clients. Diplômé de l'Institut Supérieur d'Informatique Appliquée (INSIA), Nicolas a commencé sa carrière en tant que développeur de logiciels en 2001. Après plusieurs années de programmation en Java et C++, il s'est spécialisé dans le développement client-serveur pour des sociétés de jeux vidéo. En tant que développeur/architecte serveur, il a travaillé avec succès sur les architectures serveur de nombreux jeux (Dofus Arena, Drakerz, Trivial Pursuit Go !).