venerdì 26 aprile 2013

Web Service Rest con RestEasy

Resteasy è un framework realizzato da JBoss per realizzare servizi Rest (http://www.jboss.org/resteasy).
L'ho scaricato e testato su Tomcat 7, jdk 6 di riferimento.
Per realizzarlo ho creato una Web App, mettendo nella lib tutte le librerie del pacchetto tranne la el-api-1.0.jar, poichè andava in conflitto con le librerie di Tomcat 7 (linkage error).
Nel Web xml bisogna dichiarare la servlet di riferimento, in questo caso facciamo in modo che tutte le richieste che dopo il nome della web app hanno il suffisso /rest siano intercettate dalla servlet


<!-- Auto scan REST service -->
 <context-param>
  <param-name>resteasy.scan</param-name>
  <param-value>true</param-value>
 </context-param>
 
 <!-- this need same with resteasy servlet url-pattern -->
 <context-param>
  <param-name>resteasy.servlet.mapping.prefix</param-name>
  <param-value>/rest</param-value>
 </context-param>
 
 <listener>
  <listener-class>
   org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
  </listener-class>
 </listener>
 
 <servlet>
  <servlet-name>resteasy-servlet</servlet-name>
  <servlet-class>
   org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
  </servlet-class>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>resteasy-servlet</servlet-name>
  <url-pattern>/rest/*</url-pattern>
 </servlet-mapping>
 

A questo punto dobbiamo scrivere il servizio Web.
Il servizio prende in input un intero e torna la lista dei numeri di Fibonacci fino a quell'intero assegnato.

Di seguito il codice


package it.test;
import java.util.ArrayList;
import java.util.List;
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;
import javax.ws.rs.core.Response;
@Path("/calculator")
public class MessageService {
 @GET
 @Path("/{param}")
 public Response printMessage(@PathParam("param") int val) {
        List<Integer> fibNumbers=fib(val);
  return Response.status(200).entity(listaNumeri(fibNumbers)).build();
 }
 @GET
 @Path("lista/{param}")
 @Produces(MediaType.TEXT_PLAIN)
 public String getListaNumeri(@PathParam("param")int val){
   List<Integer> fibNumbers=fib(val);
   return listaNumeri(fibNumbers);
 }
 private String listaNumeri(List<Integer> lista){
  StringBuffer sb=new StringBuffer();
  sb.append("[ ");
  for(int i=0;i<lista.size();i++){
   sb.append(lista.get(i));
   if(i<lista.size()-1)
   sb.append(",");
  }
  sb.append(" ]");
  return sb.toString();
 }
 private  List<Integer> fib(int n) {
  List<Integer> retList=new ArrayList<Integer>();
        int prev1=0, prev2=1;
        for(int i=0; i<n; i++) {
            int savePrev1 = prev1;
            retList.add(savePrev1);
            prev1 = prev2;
            prev2 = savePrev1 + prev2;
        }
        return retList;
}
 
}



Gli url per ragiungere i 2 servizi sono:
  • http://localhost:8080/restfacile/rest/calculator/15 (richiama il metodo printMessage);
  • http://localhost:8080/restfacile/rest/calculator/lista/15 (richiama il metodo getListaNumeri).

Si può testare il servizio sia da url direttamente che con un client Java.
Per realizzare il client Java ho creato un progetto java normale, mettendo nelle dipendenze le classi di resteasy + il jar commons-logging-1.1.1.jar (altrimenti avevo errore di ClassNotFoundException).

Di seguito il client:


package start;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import org.jboss.resteasy.client.ClientRequest;
import org.jboss.resteasy.client.ClientResponse;
public class RestEasyClient {
 public static void main(String[] args) throws Exception {
   
  ClientRequest request = new ClientRequest(
    "http://localhost:8080/restfacile/rest/calculator/lista/15");
  ClientResponse<String> risposta=request.get(String.class);
  if (risposta.getStatus() != 200) {
   throw new RuntimeException("Errore di tipo : "
    + risposta.getStatus());
  }
  BufferedReader br = new BufferedReader(new InputStreamReader(
   new ByteArrayInputStream(risposta.getEntity().getBytes())));
  String output;
  System.out.println("Output ottenuto .... \n");
  while ((output = br.readLine()) != null) {
   System.out.println(output);
  }
 }

}


Nessun commento:

Posta un commento