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.