Facoltà di Ingegneria - Università degli studi di Catania Dipartimento di Ingegneria Informatica e delle Telecomunicazioni RESTful WS con JAVA Breve introduzione Giovanni Morana RESTful Roy Fielding's PhD thesis (99): “Architectural Styles and the Design of Network-based Software Architectures.” Si chiede: 1. Why is the Web so prevalent and ubiquitous? 2. What makes the Web scale? 3. How can I apply the architecture of the Web to my own applications? Java Web Services RESTful Risorse indirizzabili - Info e dati sono risorse accessibili attraverso URI (Uniform Resource Identifier). Interfaccia uniforme - Gestione CRUD delle risorse Risorse in differenti formati - le risorse possono essere accedute usando diversi formati (plain text, XML, JSON) Comunicazioni STATELESS - maggiore flessibilità, facilità di scaling up Java Web Services RESTful WS REpresentational State Transfer (REST) REST è uno architectural style: le informazioni sono considerate risorse, identificate da URI, accessibili da remoto. REST si basa su comunicazioni stateless di tipo Client-Server. Tipicamente usa HTTP come protocollo di comunicazione. Un RESTful web service è uno speciale tipo di WS gestito secondo i principi REST. Usa i metodi POST, GET, PUT e DELETE per mappare le operazioni CRUD: Creazione (Create) Lettura (Read) Scrittura/Aggiornamento (Update) Eliminazione (Delete) Java Web Services Indirizzamento Ciascuna richiesta HTTP fatta per gestire una risorsa “REST” deve fare riferimento ad un URI specifico. scheme://host:port/path?queryString#fragment Scheme: http/https Host: nome logico o indirizzo IP Port: porta/opzionale Path: stringa(con /) per identificare la risorsa in uno schema gerarchico Query string: Lista di parametri (coppie nome=valore delimitate da &). http://www.ing.unict.it:8087/studente?Nome=Marco&Cognome=Rossi Fragment: indirizza porzioni specifiche del documento/risorsa a cui si accede Java Web Services Interfaccia Uniforme Ogni servizio REST ha una interfaccia uniforme ben definita Ciascun medoto esposto ha uno scopo specifico Metodo GET: Usato per recuperare le informazioni. Metodo idempotente, non modifica lo stato della risorsa (safe accessing) Metodo PUT: Usato per aggiornare lo stato delle risorse remote. Metodo idempotente. Metodo DELETE Usato per eliminare la risorsa remot. Metodo idempotente Metodo POST Unico metodo non idempotente, usato per creare nuove risorse (rappresentazione nel body) Metodo OPTIONS Usato per richiedere informazoni circa i parametri associati al tipo di comunicazione relativaalle risorse richieste.Serve a definire meglio l'interfacciamento Client-Server Java Web Services Diversità dei formati Ogni risorsa sul web può essere rappresentata in difersi formati (text, XML, JSON) Per scambiare dati in diversi formati, client e server devono accordarsi sul tipo di formato utilizzato. Solitamente si usa un Content-Type header per informare l'altra parte in quale formato si sta comunicand. Il Content-Type header us il formato Multipurpose Internet Mail Extension (MIME). type/subtype;name=value; Type identifica la famiglia mentre subtype indica la categoria. Opzionalmente è possibile inserire, attraverso name=value, specifici valori text/plain text/html application/xml charset=iso-8859-1 Java Web Services RESTful WS e JAVA La libreria JAX-RS (JSR 311) fornisce gli strumenti per creare web services RESTful-oriented in Java. Fa parte della piattaforma EE. Dal sito http://jersey.java.net/: Jersey is the open source JAX-RS (JSR 311) Reference Implementation for building RESTful Web services. But, it is also more than the Reference Implementation. Jersey provides additional APIs and extension points (SPIs) so that developers may extend Jersey to suite their needs. Java Web Services JAX-RS @PATH(percorsoRisorsa) percorso relativo che identifica la risorsa @POST identifica richieste HTTP POST @GET identifica richieste HTTP GET @PUT identifica richieste HTTP PUT @DELETE identifica risposta a richieste HTTP DELETE @Produces( MediaType.TEXT_PLAIN, [altri tipi]) definisce il tipo MIME usato per GET @Consumes( tipi ) definisce il tipo MIME usato per nel metodo considerato Attraverso queste annotazioni è possible trasformare un POJO in un RESTful Web Service Java Web Services Esempio server - HELLO WORLD Package HW; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/Saluto") public class HelloWorld { @GET @Produces(MediaType.TEXT_PLAIN) public String ptHW() { return "Hello World!"; } @GET @Produces(MediaType.TEXT_HTML) public String htmlHW() { return "<html> <title>" + "HW example" + "</title> <body> <h2>" + "Hello ” + “ </h2> <h1> World! </h1> </body> </html> "; } } Java Web Services Esempio Client import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.UniformInterfaceException; import com.sun.jersey.api.client.WebResource; public class Client { private WebResource webResource; private Client client; private static final String BASE_URI = "http://localhost:8080/Saluto/resources"; public NewJerseyClient() { com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig(); client = Client.create(config); webResource = client.resource(BASE_URI).path("HW"); } public String ptHW() throws UniformInterfaceException { WebResource res = webResource; return res.accept(javax.ws.rs.core.MediaType.TEXT_PLAIN).get(String.class); } public static void main(String args[]){ Client client = new Client(); System.out.print("Starting execution..."); System.out.print(client.ptHW()); } Java Web Services Riferimenti [1] Java EE Tutorial, ORACLE [2] RESTful Web Services Cookbook, Solutions for Improving Scalability and Simplicity By Subbu Allamaraju Publisher: O'Reilly Media / Yahoo Press [3] RESTful Java with Jax-RS By Bill Burke Publisher: O'Reilly Java Web Services Facoltà di Ingegneria - Università degli studi di Catania Dipartimento di Ingegneria Informatica e delle Telecomunicazioni RESTful WS con JAVA DOMANDE? Giovanni Morana