martedì 6 novembre 2012

Web Service Rest

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:
  • 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.
Le librerie di Jersey si trovano sul sito, la jsr311 l'ho scaricata da internet direttamente.
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.
Il codice del client è il seguente

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