In questo post vediamo come realizzare un semplice servizio Web Rest e deployarlo come una Web App sotto Tomcat 7.
Innanzitutto qui possiamo trovare le basi teoriche dei servizi Web Rest.
Tra i vantaggi dell'utilizzo di un servizio Web Rest c'è l'eliminazione del payload soap e quindi una maggiore velocità di fruizione.
Tra gli svantaggi per adesso sicuramente c'è quello di non avere un sistema built-in di security integrato (tipo WS-Security per i Web Service SOAP).
Sviluppare l'esempio di per se è stato molto semplice, l'unico problema è quello di avere le giuste dipendenze nel classpath.
Ho utilizzato le librerie di Jersey per costruire il servizio.
In particolare dentro la WEB-INF /lib ho i seguenti jar:
Nel web.xml dobbiamo configurare la servlet di Jersey per esporre il servizio.
Si noti che il param-value rappresenta il nome del package in cui abbiamo deployato il servizio.
La classe che implementa il servizio Web è la seguente:
Sono servizi in get molto semplici, con l'annotazione @Produces si specifica il tipo di output che sarà prodotto mentre con @PathParam si indica un parametro da passare in input al servizio (è il caso del metodo saluta).
Una volta fatto partire il server possiamo verificare che il servizio risponda digitando
Poichè nei servizi rest una risorsa è indentificata dal suo URI aggiungendo al path della web app +path servlet il nome specificato nell'annotazione @Path della classe.
Scrivere un client Java al servizio
Ho creato un semplice java project inserendo le seguenti librerie nel classpath:
Innanzitutto qui possiamo trovare le basi teoriche dei servizi Web Rest.
Tra i vantaggi dell'utilizzo di un servizio Web Rest c'è l'eliminazione del payload soap e quindi una maggiore velocità di fruizione.
Tra gli svantaggi per adesso sicuramente c'è quello di non avere un sistema built-in di security integrato (tipo WS-Security per i Web Service SOAP).
Sviluppare l'esempio di per se è stato molto semplice, l'unico problema è quello di avere le giuste dipendenze nel classpath.
Ho utilizzato le librerie di Jersey per costruire il servizio.
In particolare dentro la WEB-INF /lib ho i seguenti jar:
- asm-3.3.1.jar;
- jaxrs-api.jar;
- jersey-core-1.1.5.1.jar;
- jersey-server-1.1.5.1.jar;
- jsr311-api-1.1.jar.
Nel web.xml dobbiamo configurare la servlet di Jersey per esporre il servizio.
<servlet>
<servlet-name>RestfulContainer</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>it.test</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RestfulContainer</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
Si noti che il param-value rappresenta il nome del package in cui abbiamo deployato il servizio.
La classe che implementa il servizio Web è la seguente:
package it.test;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
// The Java class will be hosted at the URI path "/helloworld"
@Path("/helloworld")
public class RestTest {
// This method is called if TEXT_PLAIN is request
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
return "Hello Jersey";
}
// This method is called if XML is request
@GET
@Produces(MediaType.TEXT_XML)
public String sayXMLHello() {
return "" + "<hello> Hello Jersey" + "</hello>";
}
// This method is called if HTML is request
@GET
@Produces(MediaType.TEXT_HTML)
public String sayHtmlHello() {
return "<html> " + "<title>" + "Hello Jersey" + "</title>"
+ "<body><h1>
<b>" + "Hello Gino" + "<b></b></b></h1>
</body></html></code></pre>
" + " ";
}
@GET
@Path("/greetings/{test}")
@Produces(MediaType.TEXT_PLAIN)
public String saluta(@PathParam("test") String t){
return "Ciao "+t;
}
}
Sono servizi in get molto semplici, con l'annotazione @Produces si specifica il tipo di output che sarà prodotto mentre con @PathParam si indica un parametro da passare in input al servizio (è il caso del metodo saluta).
Una volta fatto partire il server possiamo verificare che il servizio risponda digitando
http://localhost:8080/TestRest/rest/helloworld
Dovrebbe apparire una pagina bianca con scritto "Hello Gino".Poichè nei servizi rest una risorsa è indentificata dal suo URI aggiungendo al path della web app +path servlet il nome specificato nell'annotazione @Path della classe.
Scrivere un client Java al servizio
Ho creato un semplice java project inserendo le seguenti librerie nel classpath:
- asm-3.3.1.jar;
- jaxrs-api.jar;
- jersey-bundle-1.9.1.jar.
package it.client;
import java.net.URI;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
public class ClientTest {
public static void main(String[] args) {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(getBaseURI());
// Fluent interfaces
System.out.println(service.path("rest").path("helloworld").accept(MediaType.TEXT_PLAIN).get(ClientResponse.class).toString());
// Get plain text
System.out.println(service.path("rest").path("helloworld").accept(MediaType.TEXT_PLAIN).get(String.class));
// Get XML
System.out.println(service.path("rest").path("helloworld").accept(MediaType.TEXT_XML).get(String.class));
// The HTML
System.out.println(service.path("rest").path("helloworld").accept(MediaType.TEXT_HTML).get(String.class));
System.out.println(service.path("rest").path("helloworld/greetings/kjasdkjasd").type(MediaType.TEXT_PLAIN).get(String.class));
}
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost:8080/TestRest").build();
}
}
L'output prodotto a console è il seguente:
GET http://localhost:8080/TestRest/rest/helloworld returned a response status of 200 OK
Hello Jersey
<hello> Hello Jersey</hello>
<html> <title>Hello Jersey</title><body><h1>
<b>Hello Gino<b></b></b></h1>
</body></html>
Ciao kjasdkjasd
Nessun commento:
Posta un commento