lunes, 13 de diciembre de 2010

RESTful Webservices con Java (Jersey / JAX-RS) - Tutorial Uno

REST con Java (JAX-RS) usando Jersey

Este articulo explica como desarrollar RESTful web services en Java con JAX-RS implementacion de Jersey.


En este ejemplo se usara SpringSource Tools Suite(Eclipse Helios), Java 1.6, SpringSource TC Server and JAX-RS 1.1. (Jersey 1.4).


1. REST - Representational State Transfer

1.1 Informacion General:
En una Arquitectura REST tipicamente se tiene un REST server, el cual provee acceso a los Clientes REST  que acceden a consultar, modificar un Recurso REST.

REST permite que los recursos sean presentados en diferentes tipos de datos, "text, html, xml, JSON".  El Cliente REST puede generar una peticion de un tipo de dato via el protocolo HTTP.

1.2. HTTP metodos

Los metodos estandar HTTP usados en en REST son  PUT, GET, POST, DELETE.

1.3. RESTFul webservices

Un RESTFul webservices es basados en metodos HTTP y en el concepto REST. Por lo general se define URI base para los servicios, los MIME-types sus soportes (XML, Text, JSON, user-defined,..) y un conjunto de operaciones (POST, GET, PUT, DELETE) que seran soportados. JAX-RS soporta la creacion de XML y JSON.

1.4. Java, REST and Jersey

Java define el estandar de  REST  via JAX-RS (The Java API for RESTful Web Services) en JSR 311 . Jersey es la implementación de referencia de esta especificación. Jersey contiene basicamente el core server y el core client. El core client provee una libreria para comunicar con el Server. 
JAX-RS usa  anotaciones que definen las clases pertinentes de REST.




2. Instalacion

2.1.  Jersey

Download Jersey de Jersey Homepage . extraer el zip y usar los JARS de la carpeta lib

2.2.  STS(Eclipse) y  STS Server(Tomcat)

Descargar 


SpringSource Tool Suite STS server viene incluido  en el STS. 



3. Crear tu primer RESTful Webservice


Crear un nuevo proyecto "Dynamic Web Project" "WebServiceOne". 




Copiar todo los  jars de la carpeta lib de zip Jersey dentro de "WEB-INF/lib".

3.2.  Java Class

Crear la clase domain.


package com.android.peru.wsone;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class WSOneAll {
 private String summary;
 private String description; 
 public String getSummary() {
  return summary;
 }
 public void setSummary(String summary) {
  this.summary = summary;
 }
 public String getDescription() {
  return description;
 }
 public void setDescription(String description) {
  this.description = description;
 }
}


Crear la siguiente clase.

package com.android.peru.wsone;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/WSOneAll")
public class WSOneAllResource {

 @GET
 @Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
 public WSOneAll getXML() {
  WSOneAll wsOneAll = new WSOneAll();
  wsOneAll.setSummary("Este es mi primer WS.");
  wsOneAll.setDescription("JSON: Este es mi primer WS con XML, JSON");
  return wsOneAll;
 }

 // This can be used to test the integration with the browser
 @GET
 @Produces( { MediaType.TEXT_XML })
 public WSOneAll getHTML() {
  WSOneAll wsOneAll = new WSOneAll();
  wsOneAll.setSummary("Este es mi primer WS.");
  wsOneAll.setDescription("XML: Este es mi primer WS con XML, JSON");
  return wsOneAll;
 }
}

3.3.  Definir Jersey Servlet dispatcher

Necesitas registrar Jersey como servlet dispatcher para REST requests. abrir el archivo "web.xml" y modificar lo siguiente.



Tip

El parametro  "com.sun.jersey.config.property.package" define en que package buscara las clases Web Service.


3.4.  Run your rest service

Correr la  aplicacion web en el STS Server. Probar tu REST service con la siguiente url: "http://localhost:8080/WebServiceOne/rest/WSOneAll"..

El Explorer debe mostrar:

  xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <wsOneAll>
  <description>JSON: Este es mi primer WS con XML, JSONdescription>
  <summary>Este es mi primer WS.summary>
  wsOneAll>


3.5. Crear un cliente

Jersey contiene una libreria REST client. Esta libreria es usada para  testing o para construir un REST client en Java.
Crear una nueva clase Java "com.android.peru.wsone.client.WSOneClient".



package com.android.peru.wsone.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 WSOneClient {

 public static void main(String[] args) {
  WSOneAllClient();
 }

 private static void WSOneAllClient(){
  ClientConfig config = new DefaultClientConfig();
  Client client = Client.create(config);
  WebResource service = client.resource(getBaseURIWS());
  System.out.println(service.path("rest").path("WSOneAll").accept(
    MediaType.TEXT_XML).get(String.class));
  System.out.println(service.path("rest").path("WSOneAll").accept(
    MediaType.APPLICATION_JSON).get(String.class));
  System.out.println(service.path("rest").path("WSOneAll").accept(
    MediaType.APPLICATION_XML).get(String.class));
 }

 private static URI getBaseURIWS() {
  return UriBuilder.fromUri(
    "http://localhost:8080/WebServiceOne").build();
 }
}



Thank you

Gracias, Espero sirva de ayuda a la gente que esta iniciando con Web Service, en especial REST.

David Motta B.