Classi HTTP: Un nuovo modo di eseguire richieste HTTP asincrone

Tradotto automaticamente da Deepl

Nel nostro costante sforzo di migliorare la sintassi e le funzionalità di 4D, abbiamo deciso di introdurre nuovi comandi per eseguire richieste HTTP in 4D: le classi HTTP. Sono disponibili fin dalla versione 4D v19 R6 e presenteranno molti miglioramenti nelle prossime versioni. Vi mostrerò come utilizzarle subito.

Le nuove classi HTTP di HDI in azione

Richiesta semplice

La sintassi di base per inviare una richiesta HTTP è molto semplice:

$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 chiamata a 4D.HTTPRequest.new istanzia la richiesta e la invia. Il risultato della richiesta sarà recuperato nell’attributo response dell’HTTPRequest.
A questo punto, ci si chiederà cosa ci faccia questa chiamata a wait. Le nuove classi HTTP sono pensate per essere usate in modo asincrono. Non è necessario creare un processo specifico per ospitare la richiesta; ora è possibile inviare una richiesta nel mezzo di un metodo senza bloccarlo. Ma se si vuole mantenere il vecchio comportamento sincrono, si può fare una chiamata a wait per attendere il completamento della richiesta.

Richiesta asincrona

Vediamo ora come effettuare una richiesta realmente asincrona:

$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

Ecco qui, semplice. Ora è possibile eseguire il codice mentre la richiesta viene inviata e, di conseguenza, beneficiare di prestazioni ottimali.

richiesta asincrona con callback

L’ultimo esempio sarà leggermente più complicato. La nuova sintassi consente di gestire le richieste tramite callback. In genere, si scrive una nuova classe per gestire la richiesta 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.

Si userà poi questa classe per gestire automaticamente le richieste:

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

Non è necessario gestire la richiesta nel proprio metodo; il risultato della richiesta sarà gestito grazie ai callback onResponse e onError, non appena sarà disponibile una risposta. Bisogna fare attenzione a una sola cosa: le callback sono chiamate nello stesso processo del metodo. Se si chiude il processo prima della chiamata, si perderà il risultato della richiesta. Alla fine del metodo, verificare che tutte le richieste siano state completate.

Esempio

Per l’ultimo esempio, esaminiamo una situazione reale. Richiederemo un’API REST di Trivia e invieremo una domanda casuale all’utente. Ecco la classe per gestire la richiesta:

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

E poi si può inviare la richiesta:

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

Divertitevi a rispondere alle domande casuali di Trivia!

Come faccio a

Bel tempo in Francia oggi

Per illustrare questa funzione, ecco un esempio dimostrativo che interroga un servizio REST di previsioni del tempo. Vedrete tutte queste diverse richieste in azione per fornirvi le migliori previsioni del tempo finché vivete in Francia (o avete intenzione di viaggiare in Francia).

Questo è il primo post del blog sulle nuove classi HTTP, ma non dimenticate che si tratta di una lunga serie, perché presto verranno rilasciate nuove funzionalità HTTP!

Come al solito, se avete commenti, sentitevi liberi di condividerli con noi sul forum ufficiale di 4D.

Nicolas Brachfogel
- Proprietario del prodotto e sviluppatore senior - Nicolas Brachfogel è entrato in 4D nel 2017 come Senior Developer (4D Server e networking). In qualità di Product Owner per gestire il rilascio di Apple Silicon, si occupa di scrivere le storie degli utenti e di tradurle in specifiche funzionali, nonché di assicurarsi che le implementazioni delle funzionalità soddisfino le esigenze dei clienti. Diplomato all'Institut Supérieur d'Informatique Appliquée (INSIA), Nicolas ha iniziato la sua carriera come sviluppatore di software nel 2001. Dopo diversi anni di codifica in Java e C++, si è specializzato nello sviluppo di client-server per aziende di videogiochi. Come sviluppatore/architetto di server, ha lavorato con successo alle architetture server di molti giochi (Dofus Arena, Drakerz, Trivial Pursuit Go!).