RFc -Restori Fabrizio Consulenze- S.da Buffolara, 67 -43126 Parma- Tel. +39 335 240228 Fax +39 0521 940035 P.IVA 01788460341
[1]I Web services (WS) sono meccanismi che consentono lo scambio di informazioni fra applicazioni. Tipicamente le applicazioni sono remote l'una all'altra e lo scambio avviene utilizzando internet. La definizione più esaustiva è reperibile sul sito del World Wide Web Consortium (W3C) [2] dove dice: "A Web service is a software system designed to support interoperable machine-to-machine interaction over a network."
Il concetto di web services, come il nome stesso suggerisce, è legato al web, ad internet e al protocollo HTTP, anche se ci sono diversi metodi e 'filosofie' di implementazione.
In questo articolo ritengo inutile entrare nei dettagli di queste implementazioni, una buona spiegazione si trova su http://www.html.it/pag/19595/introduzione-ai-web-service/ [3] dove vengono evidenziate le differenze fra SOAP (Simple Object Access Protocol), REST (Representational State Transfer) e come quest'ultimo può essere utilizzato.
Di seguito mi limito a descrivere l'utilizzo di web services in ambito Drupal, attraverso il modulo services.
La community di Drupal mette a disposizione altri moduli che interessano i web services.
Web services, nativo in Drupal 8, porta Drupal verso un suo utilizzo come back end, ovvero come fornitore di un servizio, anche separato dall'interfaccia che visualizza i dati: il front end (tipicamente il browser).
Gli esempi di seguito riportati sono per Drupal 7. In Drupal 8 i concetti restano simili, ma cambiano i alcune interfacce e i meccanismi di configurazione.
I web services mettono a disposizione delle risorse identificate con l'URL (Uniform Resource Locator). In un primo e semplicistico approccio, si può pensare alla risorsa come ad una pagina web o comunque dati presenti sul web.
I WS consentono l'impiego di diverse metodologie per lo scambio dei dati, ad esempio SOAP, XML RPC e REST. L'ultimo è quello che verrà impiegato di seguito. Per i dettagli si rimanda ai link citati.
I metodi, ovvero le operazioni che sono possibili sulle risorse sono quelli tipici del protocollo HTTP, in particolare GET, POST, PUT e DELETE. GET richiede una risorsa, POST crea una nuova risorsa, PUT modifica una risorsa, DELETE cancella la risorsa. Da qui l'acronimo CURD (Create, Update, Retrive, Delete).
Nella implementazione in Drupal occorre installare il modulo services [4](la versione 3.x) e relative dipendenze, abilitarlo, configurare e definire le risorse che si vogliono mettere a disposizione.
Sul sito Drupal.org è disponibile una buona documentazione di services [5].
Sorvoliamo sulla installazione e abilitazione del modulo che è quella classica per Drupal. Le dipendenze del modulo services sono ctools e libraries, come indicato nella documentazione [5].
Una volta installati i moduli occorre abilitare ctools, libraries, servicies, e Server REST (è disponibile anche XMLRPC Server).
REST e XMLRPC, senza voler approfondire, sono due dei possibili meccanismi per scambiare e rappresentare informazioni.
Negli esempi che seguono, saranno creati due endpoint, che identificano il punto (path) di accesso al servzio. Li chiamerò, arbitrariamente, naws e aws. Il primo per l'accesso ai services senza autenticazione e il secondo con autenticazione. In pratica, l'endpoint, è la parte di URL che identifica l'accesso ai web services, ad esempio www.sito.com/aws [12].
E' bene precisare che l'accesso dei dati via WS è possibile solo se l'utente (anonimo, nel caso di assenza di autenticazione) ha i dovuti permessi pertanto, se utente anonimo non ha il permesso ad accedere a determinate informazioni, le informazioni non saranno accessibili nemmeno via WS.
La configurazione di WS inizia con la definizione dell'endpoint e delle risorse, fra tutte quelle disponibili, che verranno messe a disposizione nell'endpoint. Possono essere definiti più endpoint, ognuno con le caratteristiche e le risorse desiderate.
Partiamo senza autenticazione e aggiungiamo l'endpoint, selezioniamo aggiungi www.sito.com/admin/structure/services: [13]
Il nome dell'endpoint è bene che sia qualcosa di significativo per l'amministratore dei WS.
La voce 2 in figura, Server, non è disponibile se non è stato abilitato il modulo REST Server.
Salvate le impostazioni occorre definire le risorse.
Le risorse sono gli 'oggetti' che Drupal può mettere a disposizione. Si tratta dei nodi, di utenti, della tassonomia, di parametri del sistema e altro.
Nell'esempio verranno abilitate le risorse nodi e utenti e tutte le sottorisorse disponibili. Le sottorisorse, sono le azioni possibili sulla risorsa. Ad esempio si può rendere disponibile il metodo GET sulla risorsa nodo, ma non il metodo DELETE.
E' bene sottolineare che rendere disponibile un metodo, ad esempio DELETE, non significa consentire la cancellazione dei nodi a tutti via WS: la cancellazione sarà consentita solo agli utenti autorizzati quindi, di default, non all'utente anonimo.
Un ultimo sforzo serve per definire quali formati dati vengono resi disponibili. REST non definisce uno specifico formato per i dati scambiati, ma ne può utilizzare diversi. fra i più comuni ci sono XML (eXtensible Markup Language) e JSON (JavaScript Object Notation), quest'ultimo è particolarmente indicato per scambiare dati con applicazioni java. Se il client che utilizza i dati è una procedura scritta in PHP, formato PHP può essere quello opportuno.
I vari formati possono coesistere. La richiesta alla risorsa definirà il formato desiderato (fra quelli rese disponibili.
XML (ma anche json e php) hanno la caratteristica di essere facilmente leggibili anche da una persona (oltre che, ovviamente, da una macchina).
La voce Request parsing, definisce quali MIME media type [20] sono resi disponibili dai WS.
Salvate le configurazioni i WS sono disponibili e funzionanti. Basta provare.
Il modo più semplice per accedere ai WS vede l'utilizzo di un normale browser, inserendo l'opportuno URL. Proviamo a vedere quali sono i nodi inseriti nel sito (quelli per cui l'utente anonimo ha i permessi).
L'URL è www.sito.com/naws/node [21] (nomesito/endpoint/risorsa)
Si tratta del nome del sito seguito dall'endpoint e dal nome della risorsa. Il risultato è l'elenco (list) dei nodi in formato XML.
Lo stesso elenco è disponibile in formato json, semplicemente aggiungendo .json all'URL della richiesta: www.sito.com/naws/node.json [23] Un po' difficile da leggere se non si riorganizza la risposta.
{
"nid":"40",
"vid":"40",
"type":"article",
"language":"it",
"title":"Il mio nodo",
"uid":"13",
"status":"1",
"created":"1470060869",
...
Per accedere ad uno specifico nodo, basta aggiungere il numero del nodo all'URL: www.sito.com/naws/node/1 [25] (www.sito.com/naws/node/1.json [26] per il formato json)
Le operazioni si complicano se si vogliono testare i WS con richieste più complesse, ad esempio per postare un nodo.
In questo caso non è possibile utilizzare l'URL del browser per richiamare il metodo POST. Occorre, inoltre compilare correttamente l'header della richiesta HTTP e passare ai WS i dati necessari (non possibile via URL).
Per prove occorrono strumenti adeguati, come plugin del browser o programmi ad hoc. Ad esempio per Firefox si può usare Hottprequester o Postman in Crome.
Questo però alla prossima puntata.
Si conclude con un paio di video che in modo semplice illustrano le varie operazioni.
Links
[1] https://www.rfc.it/sites/default/files/u1/WS.png
[2] https://www.w3.org/TR/2004/NOTE-ws-arch-20040211/#whatis
[3] http://www.html.it/pag/19595/introduzione-ai-web-service/
[4] https://www.drupal.org/project/services
[5] https://www.Drupal.org/node/783236
[6] https://www.rfc.it/comment/reply/515#comment-form
[7] https://www.rfc.it/category/categoria/web-services
[8] https://www.rfc.it/category/categoria/drupal
[9] https://www.rfc.it/category/categoria/restful
[10] https://www.rfc.it/category/tipologia/siti
[11] https://www.rfc.it/sites/default/files/u1/WS_REST.jpg
[12] http://www.sito.com/aws
[13] http://www.sito.com/admin/structure/services:
[14] https://www.rfc.it/sites/default/files/u1/WS_Aggiungi.jpg
[15] https://www.rfc.it/sites/default/files/u1/WS_Aggiungi_1.jpg
[16] https://www.rfc.it/sites/default/files/u1/WS_Resource.jpg
[17] https://www.rfc.it/sites/default/files/u1/WS_Risorse.jpg
[18] https://www.rfc.it/sites/default/files/u1/WS_Resource_1.jpg
[19] https://www.rfc.it/sites/default/files/u1/WS_formatetr.jpg
[20] https://en.wikipedia.org/wiki/Media_type
[21] http://www.sito.com/naws/node
[22] https://www.rfc.it/sites/default/files/u1/WS_node_list.jpg
[23] http://www.sito.com/naws/node.json
[24] https://www.rfc.it/sites/default/files/u1/WS_node_list.json_.jpg
[25] http://www.sito.com/naws/node/1
[26] http://www.sito.com/naws/node/1.json
[27] https://www.rfc.it/sites/default/files/u1/WS_nodo_1.jpg
[28] https://www.rfc.it/comment/reply/516#comment-form