Nel mondo digitale di oggi, un’esperienza utente fluida e intuitiva è fondamentale per il successo di qualsiasi applicazione web. Una parte fondamentale di questa esperienza consiste nel fornire agli utenti un facile accesso a varie risorse, siano esse documenti, immagini o altri tipi di dati. Per rendere possibile tutto ciò, il server deve gestire e fornire in modo efficiente diversi formati di contenuto.
Con la nuova funzione del server REST di 4D, la gestione della distribuzione di contenuti diversi è ora più facile che mai. In precedenza, il server REST poteva restituire solo dati scalari, di entità o di selezione di entità. Ora è in grado di fornire direttamente contenuti web completi, pronti per essere gestiti da un browser.
Scaricare file o ricevere dati binari dal server REST è ora semplice, grazie alla nuova classe OutgoingMessage. Con essa è possibile personalizzare facilmente le risposte in base alle proprie esigenze.
Continuate a leggere per scoprire come la classe OutgoingMessage può migliorare la vostra applicazione!
Chiamare una funzione esposta sul server REST
Promemoria rapido: Le funzioni del modello di dati ORDA e le funzioni singleton sono richiamabili come API REST. Per rinfrescarvi la memoria, consultate questo post del blog e questo.
Finora, il server REST poteva restituire vari tipi di risultati, come scale, entità o selezioni di entità, avvolti in un oggetto usando la proprietà result.
esempio
Questa è la funzione getSomeInfo() sulla classe Datastore.
exposed Function getSomeInfo() : Text
return "This is the info"
Ed ecco il risultato ottenuto quando viene richiamata con la richiesta /rest/$catalog/getSomeInfo:
{
"result": "This is the info"
}
I comandi Web 4D non possono essere utilizzati in queste funzioni, per questo la nuova classe OutgoingMessage offre un grande vantaggio.
La nuova classe OutgoingMessage
Le funzioni del modello di dati e dei singleton di ORDA possono ora restituire un oggetto istanza di questa nuova classe. OutgoingMessage classe.
Tali oggetti vengono gestiti direttamente da qualsiasi browser come contenuto web.
In questo modo, è possibile proporre ai propri utenti finali funzionalità quali il download di file e immagini e la ricezione di qualsiasi tipo di contenuto tramite un browser.
Questa è la rappresentazione JSON di un’istanza di oggetto della classe OutgoingMessage classe.
esempio
In questo esempio, la funzione getFile() è implementata nella classe Datastore. Lo scopo è quello di restituire il file testFile.pdf come risposta alla richiesta.
Viene creata un’istanza di oggetto della classe OutgoingMessage viene creata.
Il corpo contiene il contenuto binario del file testFile.pdf e un’intestazione che indica che il tipo di contenuto è impostato.
exposed onHTTPGet Function getFile() : 4D.OutgoingMessage
var $result:=4D.OutgoingMessage.new()
var $file:=File("/RESOURCES/testFile.pdf")
$result.setBody($file.getContent()) // This is binary content
$result.setHeader("Content-Type"; "application/pdf")
return $result
La classe OutgoingMessage contiene tre proprietà da riempire in base alle proprie esigenze:
- header: Imposta qualsiasi intestazione HTTP che il client è tenuto a gestire(ad esempio, content-type per indicare il tipo di contenuto del corpo).
- body: impostare il contenuto che si vuole inviare come risposta alla richiesta. Può essere una stringa o un blob(ad esempio, un file, un documento o un’immagine come contenuto binario).
- status: Imposta un codice di stato HTTP in base al risultato della richiesta. Questo fornisce al client informazioni sull’esito della richiesta (adesempio, lo stato 403 se la richiesta viene rifiutata). Il valore predefinito è 200.
N.B. Le proprietà body e status possono essere modificate con l’operatore := o con le corrispondenti proprietà setBody() / setStatus() .
facilitare la chiamata di funzioni sul server di riposo
la nuova parola chiave onHTTPGet per le funzioni
Finora, le chiamate di funzioni (di classi e singleton del modello di dati ORDA ) attraverso il server REST dovevano essere effettuate con un verbo POST. Questo per motivi di sicurezza, per evitare di eseguire codice sensibile attraverso un’azione semplice come il clic su un link.
Poiché il POST non è sempre adatto all’esperienza utente che si vuole offrire, queste funzioni possono essere richiamate anche con un verbo GET , cioè richiamabili inserendo un URL in un browser.
Utilizzare la parola chiave new onHTTPGet per questo. Se questa parola chiave è applicata a una funzione, questa funzione è anche richiamabile con un verbo GET!
esempio
exposed onHTTPGet Function getSomeInfo() : 4D.OutgoingMessage
N.B. Poiché questo tipo di chiamata è un’azione che può essere facilmente offerta, lo sviluppatore deve assicurarsi che in tali funzioni non vengano eseguite azioni sensibili.
passaggio di parametri
I parametri possono essere passati alla funzione con il parametro $params (deve essere racchiuso in un insieme).
esempio
In questo esempio, viene richiamata la funzione getThumbnail() della classe di dati Products (per ottenere una foto in miniatura di un determinato prodotto).
Riceve il nome del prodotto e la larghezza + lunghezza richieste.
IP:port/rest/Products/getThumbnail?$params='["Yellow Pack",200,200]'
Per ulteriori informazioni sull’invio di parametri quando si chiama una funzione, consultare la documentazione.
Un esempio completo
Ecco il caso d’uso di questo esempio: a un utente finale viene proposto un link per scaricare il manuale d’uso di un prodotto selezionato con diversi formati disponibili.
La richiesta dietro il link è: IP:port/rest/Products/getUserManual?$params='[1, “pdf”]’
L’id del prodotto selezionato (1) viene passato come parametro e il formato richiesto (pdf).
Viene richiamata la funzione getUserManual() della classe di dati Products. Riceve l’id del prodotto e il formato come parametro.
Viene recuperato il documento corrispondente. Il suo contenuto binario viene inserito come corpo nella risposta con il tipo di contenuto corrispondente.
exposed onHTTPGet Function getUserManual($productId : Integer; $type : Text) : 4D.OutgoingMessage
var $file : 4D.File
var $response:=4D.OutgoingMessage.new()
var $doc:="/RESOURCES/User manuals/product_"+String($productId)
Case of
: ($type="pdf")
$file:=File($doc+".pdf")
$response.setBody($file.getContent()) // This is binary content
$response.setHeader("Content-Type"; "application/pdf")
: ($type="jpeg")
$file:=File($doc+".jpeg")
$response.setBody($file.getContent()) // This is binary content
$response.setHeader("Content-Type"; "image/jpeg")
End case
return $response
Ecco lo scenario riprodotto in un browser:
Prova tu stesso
Scaricate l’HDI per esplorare questa nuova funzionalità e consultate la documentazione per maggiori dettagli sull’utilizzo della classe OutgoingMessage nelle vostre applicazioni web.