SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
REST con Java usando Jersey
Presenta
Ing. Abimael Desales López
https://www.facebook.com/JavaDevelopersMexico
JavaDevelopersMexico en Google +
“El conocimiento es libre y está en búsqueda de que lo
hagas tuyo, sólo necesitas práctica y paciencia”
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
Tutorial - REST con Java (JAX-RS) usando Jersey
Copyright © 2015 JavaDevelopersMexico
10/08/2015
Web services RESTful con Java (Jersey / JAX-RS)
Este tutorial explica cómo desarrollar web services RESTful en Java con Jersey la implementación
de referencia de JAX-RS.
En este tutorial usamos los siguientes artefactos de software
 Eclipse 4.4 (Luna)
 Java 1.8.0_45,
 Tomcat 7.0
 JAX-RS 2.0 (con Jersey 2.19).
Tabla de Contenido
Audiencia
1. REST - Representational State Transfer
1.1. ¿Qué esREST?
1.2. MétodosHTTP
1.3. WebServicesRESTFul
2. JAX-RScon Jersey
2.1. JAX-RS
2.2. Jersey
2.3. AnotacionesJAX-RS
3. Instalaciónde Jersey
4. ContenedorWeb
5. Prerrequisitos
6. Crea tu primerWebservice RESTful
6.1. Creaun nuevoproyectoweb
6.2. AgregalosJARsde Jersey
6.3. Clase Java
6.4. Define el Servletdispatcherde Jersey
6.5. Corre tu servicio rest
7. Crea un cliente
8. Web services RESTful yJAXB
8.1. Creaun proyecto
8.2. Creaun cliente
9. Webservice RESTful CRUD
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
9.1. Proyecto
9.2. Creaun formularioHTML simple
9.3. ServicioRest
9.4. Corre
9.5. Creaun cliente
9.6. Usandoel servicioRESTvía unapágina HTML
BibliografíayWebgrafía
Audiencia
Este tutorial está diseñado para profesionales de software quienes quieren aprender sobre
servicios web RESTful en pasos simples y fáciles. Este tutorial te proporcionará
conocimientos sobre los conceptos de servicios web RESTful, y después de completar este
tutorial estarás en un nivel intermedio de expertise desde donde puedes subir por ti mismo a
un nivel de expertise más alto a través de la práctica.
1. REST - Representational State Transfer
1.1. ¿Qué es REST?
REST es un estilo arquitectural que está basado en estándares web y el protocolo HTTP.
REST fue descrito por primera vez por Roy Fielding en el 2000.
En una arquitectura REST todo es un recurso. Un recurso es accesado vía una interfaz
común basada en los métodos HTTP estándar.
En una arquitectura basada en REST generalmente tienes un servidor REST que
proporciona acceso a los recursos y un cliente REST que accesa y modifica los recursos
REST.
Cada recurso debe soportar las operaciones HTTP comunes. Los recursos son identificados
por IDs globales (las cuales típicamente son URIs).
REST permite que los recursos tengan diferentes representaciones, p.e., texto, XML, JSON,
etc. El cliente REST puede preguntar por una representación específica vía el protocolo
HTTP (negociación de contenido).
1.2. Métodos HTTP
Los métodos PUT, GET, POST DELETE, y OPTIONS generalmente son usados en
arquitecturas basadas en REST.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
La siguiente tabla proporciona una explicación de estas operaciones.
GET Define un acceso de lectura del recurso sin efectos colaterales. El recurso nunca es
cambiado vía una request GET, p.e., la request no tiene efectos colaterales
(idempotente).
PUT Crea un nuevo recurso. También de debe ser idempotente
DELETE Usado para remover un recurso. Las operaciones son idempotentes. Pueden ser
repetidas sin llevar a diferentes resultados.
POST Usado para actualizar un recurso existente o crear un nuevo recurso
OPTIONS Usado para obtener las operaciones soportadas por un recurso
1.3. Web services RESTFul
Los web services RESTFul están basados en métodos HTTP y el concepto de REST. Un
web service RESTFul típicamente define la URI base URI para los servicios, los tipos MIME
soportados (XML, text, JSON, definido por el usuario,...) y el conjunto de operaciones (POST,
GET, PUT, DELETE) que son soportadas.
2. JAX-RS con Jersey
2.1. JAX-RS
Java define el soporte de REST vía la Java Specification Request (JSR) 311. Esta
especificación es llamada JAX-RS (la Java API for RESTful Web Services). JAX-RS usa
anotaciones para definir la relevancia de REST en las clases Java.
2.2. Jersey
Jersey es implementación de referencia para la especificación JSR 311.
La implementación Jersey provee una librería para implementar webservices Restful en un
contenedor de servlets Java.
En el lado del servidor Jersey provee una implementación de servlet que escanea las clases
predefinidas para identificar los recursos RESTful. En tu archivo de configuración web.xml
debes registrar este servlet para tu aplicación web.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
La implementación Jersey también proporciona una librería cliente para comunciarse con un
webservice RESTful.
La URL base de este servlet es:
http://tu_dominio:puerto/nombre-despliegue/url-pattern/path_de_clases_rest
Este servlet analiza la request HTTP entrante y selecciona la clase correcta y método para
responder a esta request. Esta selección está basada en anotaciones en la clase y métodos.
Una aplicación web REST consiste, por lo tanto, de clases (recursos) y servicios. Estos dos
tipos típicamente son mantenidos en diferentes packages ya que el servlet Jersey será
instruido vía el web.xml para que escanee ciertos packages para las clases de datos.
JAX-RS soporta la creación de XML y JSON vía la Java Architecture for XML Binding (JAXB).
2.3. Anotaciones JAX-RS
Las anotaciones más importantes en JAX-RS son listados en la siguiente tabla.
Tabla 1. Anotaciones JAX-RS
Anotación Descripción
@PATH(tu_path)
Asigna el path a la URL base + /tu_path. La URL base está basada
en el nombre de tu aplicación,el servlet y la URL pattern del archivo
de configuración web.xml.
@POST Indica que el método siguiente responderá a una request POST
HTTP.
@GET
Indica que el método siguiente responderá a una request GET
HTTP.
@PUT
Indica que el siguiente método responderá a una requestPUT
HTTP.
@DELETE
Indica que el siguiente método responderá a una request DELETE
HTTP.
@Produces(MediaType.TEXT_PLAIN[,
more-types])
@Produces define qué tipo MIME es entregado por un método
anotado con @GET. En el ejemplo se produce texto ("text/plain").
Otros ejemplos serían "application/xml"o "application/json".
@Consumes(type[, mas-tipos]) @Consumes define qué tipo MIME es consumido por este método.
@PathParam
Usado para inyectar valores de la URL en un parámetro del método.
De esta forma inyectas,por ejemplo,el ID de un recurso en el
método para obtener el objeto correcto.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
El path completo a un recurso está basado en la URL base y la anotación @PATh en tu
clase.
http://tu_dominio:puerto/nombre-despliegue/url-pattern/path_de_clases_rest
3. Instalación de Jersey
Descarga la distribución Jersey como archivo zip desde el sitio de descarga de Jersey.
El zip contiene el JAR de la implementación Jersey y sus dependencias core. No proporciona
dependencias para JArs de tecerceros más allá de aquellos para el soporte de JSON y
JavaDoc.
4. Contenedor Web
Para este tutorial puedes usar cualquier contenedor web, por ejemplo Tomcat o la Google
App Engine.
Si quieres usar Tomcat como contenedor de servlet por favor mira Eclipse WTP y Apache
Tomcat para las instrucciones sobre cómo instalar y usar Eclipse WTP y Apache Tomcat.
Alternativamente también podrías usar la Google App Engine para correr la parte del servidor
de los siguientes ejemplos de REST. Si usas la Google App Engine, no tienes que instalar y
configure Tomcat.
Tip
Si estás usando GAE/J, tienes que crear proyectos de App Engine en vez de Dynamic Web
Project. La siguiente descripción está basada en Apache Tomcat.
5. Prerrequisitos
Antes de proceder con este tutorial debes tener una comprensión básica del lenguaje Java,
editores de texto, IDEs, servidores web, etc. Debido a que vamos a desarrollar aplicaciones de
web services usando RESTful, será bueno que tengas conocimientos sobre otras tecnologías
web como HTML, CSS, AJAX etc.
6. Crea tu primer Webservice RESTful
6.1. Crea un nuevo proyecto web
Crea un nuevo Dynamic Web Project llamado it.adesales.primer.rest.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
Haz click en Next
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
Asegúrate de crear el descriptor de deployment web.xml.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
Seleccionando la casilla Generate web.xml deployment descriptor y además cambia el nombre
de content directory por Web en vez de WebContent para estandarizar la aplicación.
6.2. Agrega los JARs de Jersey
Copia todos los JARs de tu descarga de Jersey (los que hay dentro de las tres carpetas de
librerías, api, ext y lib) en la carpeta WEB-INF/lib.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
6.3. Clase Java
Crea la siguiente clase Java en el package it.adesales.primer.rest.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
package it.adesales.primer.rest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
// Plain old Java Object no extienden de clases o implementan una interface
// La clase registra sus métodos para la request GET HTTP usando la anotación @GET.
// Usando la anotación @Produces, define que puede entregar varios tipos MIME, texto
// XML y HTML.
// Por defaul, el navegador solicita el tipo MIME HTML.
//Asigna el path a la URL base + /hola
@Path("/hola")
public class Hola {
// Este método es llamado si se solicita TEXT_PLAIN
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHola() {
return "Hola Jersey";
}
// Este método es llamado si se solicita XML
@GET
@Produces(MediaType.TEXT_XML)
public String sayXMLHola() {
return "<?xml version="1.0"?>" + "<hello> Hola Jersey" + "</hello>";
}
// Este método es llamado si se solicita HTML
@GET
@Produces(MediaType.TEXT_HTML)
public String sayHtmlHola() {
return "<html> " + "<title>" + "Hola Jersey" + "</title>"
+ "<body><h1>" + "Hola Jersey" + "</body></h1>" + "</html> ";
}
}
Esta clase se registra a sí misma como un recurso get vía la anotación @GET. Vía la anotación
@Produces define que entrega el texto y los tipos MIME HTML. Además define vía la
anotación @Path que sus servicios están disponibles bajo la URL hola.
El navegador siempre solicitará el tipo MIME HTML. Para ver la versión texto, puedes usar
alguna herramienta como curl.
6.4. Define el despachador de Servlet de Jersey
Necesitas registrar Jersey como el despachador de servlet para solicitudes REST. Abre el
archivo web.xml y modifícalo a lo siguiente.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>it.adesales.primer.rest</display-name>
<servlet>
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Registra recursos y proveedores bajo package com.vogella.jersey.first.-->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>it.adesales.primer.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
El parámetro jersey.config.server.provider.packages define en qué package buscará
Jersey clases de web service. Esta propiedad debe apuntar a tus clases de recursos. El URL
pattern define la parte de la URL base donde tu aplicación será colocada.
6.5. Corre tu servicio rest
Corre tu aplicación web en Eclipse.
Debes ser capaz de accesar tus recursos bajo la siguiente URL en el navegador:
http://localhost:8080/it.adesales.primer.rest/rest/hola
En mi caso también pruebo con una herramienta de nombre Postman, disponible para
Chrome, recomiendo que la utilicen y jueguen con ella para que se familiaricen:
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
Este nombre es derivado del "display-name" definido en el archivo web.xml, aumentado con
el URL-pattern del servlet-mapping y la anotación @Path hola de tu archivo de clase. Debes
obtener el mensaje "Hola Jersey".
El navegador solicita la representación HTML de tu recurso. En el siguiente capítulo vamos a
escribir un cliente que leerá la representación XML.
7. Crea un cliente
Jersey contiene una librería cliente REST que se puede usar para probar o construir un cliente
real en Java. El uso de esta librería es demostrado en el siguiente ejercicio.
Crea un nuevo proyecto Java y agrega el package it.adesales.primer.rest.cliente y agrega los
JARs de Jersey al proyecto y al build path del proyecto. Crea la siguiente clase de test.
package it.adesales.primer.rest.cliente;
import java.net.URI;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.jersey.client.ClientConfig;
public class Test {
public static void main(String[] args) {
ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target = client.target(getBaseURI());
String response = target.path("rest").
path("hola").
request().
accept(MediaType.TEXT_PLAIN).
get(Response.class)
.toString();
String plainAnswer =
target.path("rest").path("hola").request().accept(MediaType.TEXT_PLAIN).get(String.class);
String xmlAnswer =
target.path("rest").path("hola").request().accept(MediaType.TEXT_XML).get(String.class);
String htmlAnswer=
target.path("rest").path("hola").request().accept(MediaType.TEXT_HTML).get(String.class);
System.out.println(response);
System.out.println(plainAnswer);
System.out.println(xmlAnswer);
System.out.println(htmlAnswer);
}
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost:8080/it.adesales.primer.rest").build();
}
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
}
8. Web services RESTful y JAXB
JAX-RS soporta la creación automática de XML y JSON vía JAXB. Si deseas una introducción
en XML por favor revisa el Tutorial Java y XML. Si deseas una introducción en JAXB por favor
revisa JAXB. Puedes continuar este tutorial sin leer estos tutoriales, pero ellos contienen más
información de fondo si quieres conocer mas sobre dichos temas.
8.1. Crea el proyecto
Crea un nuevo Dynamic Web Project llamado it.adesales.rest.jaxb. Asegúrate de seleccionar
el check para generar el descritor de deployment web.xml y renombrar la carpeta
WebContent a Web, como en el ejemplo anterior.
Copia todos los JARs de Jersey JARs a la carpeta WEB-INF/lib.
Crea tu clase de dominio Todo bajo el package it.adesales.rest.jaxb.model.
package it.adesales.rest.jaxb.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
// JAX-RS soporta un mapeo automático de clases JAXB anotadas a XML y JSON
// ¿No es esto cool?
public class Todo {
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
private String resumen;
private String descripcion;
public String getResumen() {
return resumen;
}
public void setResumen(String resumen) {
this.resumen = resumen;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
}
Crea la siguiente clase de recurso. Esta clase simplemente retorna una instancia de la clase
Todo.
package it.adesales.rest.jaxb.service;
import it.adesales.rest.jaxb.model.Todo;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/todo")
public class TodoRecurso {
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
// Este método es llamado si la request es XML
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Todo getXML() {
Todo todo = new Todo();
todo.setResumen("Este es mi primer todo XML");
todo.setDescripcion("Este es mi primer todo XML");
return todo;
}
// Esto puede ser usado para probar la integración con el navegador
@GET
@Produces({ MediaType.TEXT_XML })
public Todo getHTML() {
Todo todo = new Todo();
todo.setResumen("Este es mi primer todo HTML");
todo.setDescripcion("Este es mi primer todo HTML");
return todo;
}
}
Cambia tu web.xml a lo siguiente.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>it.adesales.rest.jaxb</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register resources and providers under com.vogella.jersey.first
package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>it.adesales.rest.jaxb.service</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Corre tu aplicación web en Eclipse y valida que puedes accesar tu servicio. Tu aplicación debe
estar disponible bajo la siguiente URL.
http://localhost:8080/com.vogella.jersey.jaxb/rest/todo
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
8.2. Crea un cliente
Crea un nuevo proyecto Java it.adesales.rest.jaxb.client y agrega los JARs de Jersey al
proyecto y al build path del proyecto. Crea la siguiente clase de test.
package it.adesales.rest.jaxb.client;
import java.net.URI;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.jersey.client.ClientConfig;
public class TodoTest {
public static void main(String[] args) {
ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target = client.target(getBaseURI());
// Obtiene el XML
String htmlResponse = target.path("rest").path("todo").request()
.accept(MediaType.TEXT_XML).get(String.class);
// Obtiene el XML para la aplicación
String xmlResponse = target.path("rest").path("todo").request()
.accept(MediaType.APPLICATION_XML).get(String.class);
// Para una response JSON también agrega las librerías de Jackson a tu
//aplicación web. En este caso también cambiarías el registro del cliente a
// ClientConfig config = new ClientConfig().register(JacksonFeature.class);
// Get JSON for application
// System.out.println(target.path("rest").path("todo").request()
// .accept(MediaType.APPLICATION_JSON).get(String.class));
System.out.println(htmlResponse);
System.out.println(xmlResponse);
}
private static URI getBaseURI() {
return
UriBuilder.fromUri(“http://localhost:8080/it.adesales.rest.jaxb“).build();
}
}
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
9. Webservice RESTful CRUD
En esta sección vamos a crear un web service RESTful CRUD (Create, Read, Update,
Delete). Permitirá mantener una lista de TODOs en tu aplicación web vía llamadas HTTP.
9.1. Proyecto
Crea un nuevo dynamic web project llamado it.adesales.rest.jaxb.crud y agrega las librerías de
Jersey. Cambia el archivo web.xml al siguiente.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>it.adesales.rest.crud</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Registar recursos y proveedores bajo com.vogella.jersey.first -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>it.adesales.rest.crud.recursos</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Crea el siguiente modelo de datos y un Singleton que sirve como el proveedor de datos para el
modelo. Nosotros usamos la implementación basada en una enumeración, puedes probar con
otras opciones como usar objetos Mocks. Por favor revisa los links para más detalles. La clase
Todo está anotada con una anotación JAXB. Véase Java y XML para aprender sobre JAXB.
package it.adesales.rest.crud.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Todo {
private String id;
private String resumen;
private String descripcion;
public Todo(){}
public Todo (String id, String resumen){
this.id = id;
this.resumen = resumen;
}
public String getId() {
return id;
}
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
public void setId(String id) {
this.id = id;
}
public String getResumen() {
return resumen;
}
public void setResumen(String resumen) {
this.resumen = resumen;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
}
package it.adesales.rest.crud.dao;
import java.util.HashMap;
import java.util.Map;
import it.adesales.rest.crud.model.Todo;
public enum TodoDao {
instance;
private Map<String, Todo> contentProvider = new HashMap<>();
private TodoDao() {
Todo todo = new Todo("1", "Aprende REST");
todo.setDescripcion("Lee mi artículo completo");
contentProvider.put("1", todo);
todo = new Todo("2", "Haz algo");
todo.setDescripcion("Visita mis sitios de Java Developers México");
contentProvider.put("2", todo);
}
public Map<String, Todo> getModel(){
return contentProvider;
}
}
9.2. Crea un formulario HTML simple
El servicio REST puede usarse vía formularios HTML. El siguiente formulario HTML permitirá
postear nuevos datos al servicio. Crea una carpeta de nombre pages dentro de la carpeta
Web y dentro de esta crea la siguiente página llamada crea_todo.html.
<!DOCTYPE html>
<html>
<head>
<title>Formulario para crear un nuevo recurso</title>
</head>
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
<body>
<form action="../it.adesales.rest.crud/rest/todos" method="POST">
<label for="id">ID</label>
<input name="id" />
<br/>
<label for="resumen">Resumen</label>
<input name="resumen" />
<br/>
Descripción:
<TEXTAREA NAME="descripcion" COLS=40 ROWS=6></TEXTAREA>
<br/>
<input type="submit" value="Submit" />
</form>
</body>
</html>
9.3. Servicio Rest
Crea las siguientes clases que se usarán como recursos REST.
package it.adesales.rest.crud.recursos;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.xml.bind.JAXBElement;
import it.adesales.rest.crud.dao.TodoDao;
import it.adesales.rest.crud.model.Todo;
public class TodoRecurso {
@Context
UriInfo uriInfo;
@Context
Request request;
String id;
public TodoRecurso(UriInfo uriInfo, Request request, String id) {
this.uriInfo = uriInfo;
this.request = request;
this.id = id;
}
//Integración de la Aplicación
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Todo getTodo() {
Todo todo = TodoDao.instance.getModel().get(id);
if(todo==null)
throw new RuntimeException("Get: Todo con " + id + " no encontrado");
return todo;
}
// para el navegador
@GET
@Produces(MediaType.TEXT_XML)
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
public Todo getTodoHTML() {
Todo todo = TodoDao.instance.getModel().get(id);
if(todo==null)
throw new RuntimeException("Get: Todo con " + id + " no encontrado ");
return todo;
}
@PUT
@Consumes(MediaType.APPLICATION_XML)
public Response putTodo(JAXBElement<Todo> todo) {
Todo c = todo.getValue();
return putAndGetResponse(c);
}
@DELETE
public void deleteTodo() {
Todo c = TodoDao.instance.getModel().remove(id);
if(c==null)
throw new RuntimeException("Delete: Todo con " + id + " no encontrado");
}
private Response putAndGetResponse(Todo todo) {
Response res;
if(TodoDao.instance.getModel().containsKey(todo.getId())) {
res = Response.noContent().build();
} else {
res = Response.created(uriInfo.getAbsolutePath()).build();
}
TodoDao.instance.getModel().put(todo.getId(), todo);
return res;
}
}
package it.adesales.rest.crud.recursos;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriInfo;
import com.vogella.jersey.todo.dao.TodoDao;
import com.vogella.jersey.todo.model.Todo;
// Mapeará el recurso a la URL todos
@Path("/todos")
public class TodosRecurso {
// Permite insertar objetos contextuales en la clase,
// p.e. ServletContext, Request, Response, UriInfo
@Context
UriInfo uriInfo;
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
@Context
Request request;
// Retorna la lista de todos al usuario en el browser
@GET
@Produces(MediaType.TEXT_XML)
public List<Todo> getTodosBrowser() {
List<Todo> todos = new ArrayList<Todo>();
todos.addAll(TodoDao.instance.getModel().values());
return todos;
}
// Retorna la lista de todos para las aplicaciones
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public List<Todo> getTodos() {
List<Todo> todos = new ArrayList<Todo>();
todos.addAll(TodoDao.instance.getModel().values());
return todos;
}
// retorna el número de todos
// Usa http://localhost:8080/it.adesales.rest.crud/rest/todos/conteo
// para obtener el número total de registros
@GET
@Path("conteo")
@Produces(MediaType.TEXT_PLAIN)
public String getCount() {
int count = TodoDao.instance.getModel().size();
return String.valueOf(count);
}
@POST
@Produces(MediaType.TEXT_HTML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void newTodo(@FormParam("id") String id,
@FormParam("resumen") String resumen,
@FormParam("descripcion") String descripcion,
@Context HttpServletResponse servletResponse) throws IOException {
Todo todo = new Todo(id, resumen);
if (descripcion != null) {
todo.setDescripcion(descripcion);
}
TodoDao.instance.getModel().put(id, todo);
servletResponse.sendRedirect("../crea_todo.html");
}
// Define que el siguiente parámetro path después de todos es tratado
// como un parámetro y pasado al TodoResources
// Permite al type http://localhost:8080/it.adesales.rest.crud/rest/todos/1
// 1 será tratado como parámetro todo y pasado a TodoResource
@Path("{todo}")
public TodoRecurso getTodo(@PathParam("todo") String id) {
return new TodoRecurso(uriInfo, request, id);
}
}
Este TodosRecurso usa la anotación @PathParam para definir que el id es insertado como
parámetro.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
9.4. Corre
Corre tu aplicación web en Eclipse y prueba la disponibilidad de tu servicio REST bajo:
http://localhost:8080/it.adesales.rest.crud/rest/todos. Debes ver la representación XML de tus
elementos TODO.
Para ver el conteo de los elementos de TODO usa la dirección
http://localhost:8080/it.adesales.rest.crud/rest/todos/conteo
para ver un TODO existente usa "http://localhost:8080/it.adesales.rest.crud/rest/todos/{id}", p.e.,
http://localhost:8080/it.adesales.rest.crud/rest/todos/1 para ver el TODO con ID 1. Actualmente
tenemos sólo TODOs con los ids 1 y 2, todas las otras requests darán como resultado un
código de error HTTP.
En la siguiente pantalla se muestra la versión solicitada en XML del todo con id=1.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
En la siguiente pantalla se muestra el todo con id=2 desde la herramienta de chrome
Postman.
La siguiente pantalla es de una request POST, ingresando los parámetros y el Content-Type
por la herramienta Postman.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
Si consultamos los recursos disponibles después de haber emitido la request POST a través
de la herramienta Postman, podremos ver lo siguiente desde el navegador o la misma tool:
Por favor, nota que con el navegador sólo puedes emitir solicitudes GET HTTP. En el
siguiente capítulo usaremos las librerías cliente de Jersey para emitir get, post y delete.
Sólo quisiera hacer una aclaración, debido a que otra aplicación ocupa el puerto 8080 de mi
equipo, he tenido que cofigurar Tomcat para que ocupe el puerto 80 en vez del 8080 que trae
por default, por ello en mis requests después de localhost omito el puerto ya que es el default
80 donde un equipo escucha requests HTTP.
Puedes omitir el siguiente punto si utilizas la herramienta Postman ya que es el cliente.
9.5. Crea un cliente
Para probar tu servicio puedes crear una nueva clase en el proyecto servidor. Este proyecto
ya tiene todas las librerías requeridas en el classpath, de forma que este es más rápido que
crear un nuevo proyecto.
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
Crea la siguiente clase.
package com.vogella.jersey.todo.client;
import java.net.URI;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.jersey.client.ClientConfig;
import it.adesales.rest.crud.model.Todo;
public class Tester {
public static void main(String[] args) {
ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget service = client.target(getBaseURI());
// crea un todo
Todo todo = new Todo("3", "Blabla");
Response response =
service.path("rest").path("todos").path(todo.getId()).request(MediaType.APPLICATI
ON_XML).put(Entity.entity(todo,MediaType.APPLICATION_XML),Response.class);
// El código de retorno debe ser 201 == recurso creado
System.out.println(response.getStatus());
// Obtén los Todos
System.out.println(service.path("rest").path("todos").request().accept(MediaType.
TEXT_XML).get(String.class));
// // Obtén JSON para la aplicación
//
System.out.println(service.path("rest").path("todos").request().accept(MediaType.
APPLICATION_JSON).get(String.class));
// Obtiene el XML para la aplicación
System.out.println(service.path("rest").path("todos").request().accept(MediaType.
APPLICATION_XML).get(String.class));
//Obtiene Todo con id 1
Response checkDelete =
service.path("rest").path("todos/1").request().accept(MediaType.APPLICATION_XML).
get();
//Elimina Todo con id 1
service.path("rest").path("todos/1").request().delete();
//Obtiene todos los Todos con id 1 quedeben ser eliminados
System.out.println(service.path("rest").path("todos").request().accept(MediaType.
APPLICATION_XML).get(String.class));
//Crea un Todo
Tutorial - REST con Java (JAX-RS) usando Jersey
www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez
Form form =new Form();
form.param("id", "4");
form.param("resumen","Demostración de la librería cliente para formularios");
response =
service.path("rest").path("todos").request().post(Entity.entity(form,MediaType.AP
PLICATION_FORM_URLENCODED),Response.class);
System.out.println("Response del formulario" + response.getStatus());
//Obtiene todos los todos, id 4 deben haber sido creados
System.out.println(service.path("rest").path("todos").request().accept(MediaType.
APPLICATION_XML).get(String.class));
}
private static URI getBaseURI() {
return
UriBuilder.fromUri("http://localhost:8080/it.adesales.rest.crud").build();
}
}
9.6. Usando el servicio REST vía página HTML
El ejemplo anterior contiene un formulario que llama a un método post de tu servicio rest.
Bibliografía y Webgrafía
El presente artículo ha sido conformado por ejemplos de libros y de artículos de la web, de los
cuales se pretende ofrecer lo mejor de cada uno, una mención especial a la página de Lars
Vogel y a tutorialespoint.com, gracias por sus buenos artículos, ha sido el comienzo y aquí
hemos buscado mejorarlos, estos se mencionan a continuación:
1.- http://www.vogella.com/
2.- http://www.tutorialspoint.com/
3.- https://es.wikipedia.org/wiki/Representational_State_Transfer
4.- Kalali Masoudy Bhakti Mehta, DevelopingRESTful Serviceswith JAXRS2.0,WebSocketsand
JSON,PACKTPublishing,UK, 2013, 128 p.
5.- Burke, Bill. RESTful JavawithJAXRS2.0. O’Really Editorial,SecondEdition, USA, 2014, 392 p.
Siéntete libre de escribirme yhacerme llegartusopiniones.

Más contenido relacionado

La actualidad más candente

UDA-Componentes RUP. Botonera
UDA-Componentes RUP. BotoneraUDA-Componentes RUP. Botonera
UDA-Componentes RUP. BotoneraAnder Martinez
 
ePub 3, HTML 5 & CSS 3 (+ Fixed-Layout)
ePub 3, HTML 5 & CSS 3 (+ Fixed-Layout)ePub 3, HTML 5 & CSS 3 (+ Fixed-Layout)
ePub 3, HTML 5 & CSS 3 (+ Fixed-Layout)Clément Wehrung
 
UDA-Componentes RUP. Feedback
UDA-Componentes RUP. FeedbackUDA-Componentes RUP. Feedback
UDA-Componentes RUP. FeedbackAnder Martinez
 
UDA-Anexo configuración y uso de jackson
UDA-Anexo configuración y uso de jacksonUDA-Anexo configuración y uso de jackson
UDA-Anexo configuración y uso de jacksonAnder Martinez
 
UDA-Componentes RUP. Formulario
UDA-Componentes RUP. FormularioUDA-Componentes RUP. Formulario
UDA-Componentes RUP. FormularioAnder Martinez
 
Aem dispatcher – tips & tricks
Aem dispatcher – tips & tricksAem dispatcher – tips & tricks
Aem dispatcher – tips & tricksAshokkumar T A
 
UDA-Componentes RUP. Mantenimiento (v2.1.1 deprecado)
UDA-Componentes RUP. Mantenimiento  (v2.1.1 deprecado)UDA-Componentes RUP. Mantenimiento  (v2.1.1 deprecado)
UDA-Componentes RUP. Mantenimiento (v2.1.1 deprecado)Ander Martinez
 
UDA-Componentes RUP. Combo
UDA-Componentes RUP. ComboUDA-Componentes RUP. Combo
UDA-Componentes RUP. ComboAnder Martinez
 
UDA-Plugin UDA. Guia de uso del plugin.
UDA-Plugin UDA. Guia de uso del plugin.UDA-Plugin UDA. Guia de uso del plugin.
UDA-Plugin UDA. Guia de uso del plugin.Ander Martinez
 
Java Server Faces (JSF) - Basics
Java Server Faces (JSF) - BasicsJava Server Faces (JSF) - Basics
Java Server Faces (JSF) - BasicsBG Java EE Course
 
UDA-Plugin UDA. Guia de desarrollo
UDA-Plugin UDA. Guia de desarrolloUDA-Plugin UDA. Guia de desarrollo
UDA-Plugin UDA. Guia de desarrolloAnder Martinez
 
UDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingUDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingAnder Martinez
 
BEM it! Introduction to BEM methodology
BEM it! Introduction to BEM methodologyBEM it! Introduction to BEM methodology
BEM it! Introduction to BEM methodologyVarya Stepanova
 
RESTful API 제대로 만들기
RESTful API 제대로 만들기RESTful API 제대로 만들기
RESTful API 제대로 만들기Juwon Kim
 
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)Ander Martinez
 

La actualidad más candente (20)

UDA-Componentes RUP. Botonera
UDA-Componentes RUP. BotoneraUDA-Componentes RUP. Botonera
UDA-Componentes RUP. Botonera
 
ePub 3, HTML 5 & CSS 3 (+ Fixed-Layout)
ePub 3, HTML 5 & CSS 3 (+ Fixed-Layout)ePub 3, HTML 5 & CSS 3 (+ Fixed-Layout)
ePub 3, HTML 5 & CSS 3 (+ Fixed-Layout)
 
UDA-Componentes RUP. Feedback
UDA-Componentes RUP. FeedbackUDA-Componentes RUP. Feedback
UDA-Componentes RUP. Feedback
 
UDA-Anexo configuración y uso de jackson
UDA-Anexo configuración y uso de jacksonUDA-Anexo configuración y uso de jackson
UDA-Anexo configuración y uso de jackson
 
Sling Models Overview
Sling Models OverviewSling Models Overview
Sling Models Overview
 
UDA-Componentes RUP. Formulario
UDA-Componentes RUP. FormularioUDA-Componentes RUP. Formulario
UDA-Componentes RUP. Formulario
 
Aem dispatcher – tips & tricks
Aem dispatcher – tips & tricksAem dispatcher – tips & tricks
Aem dispatcher – tips & tricks
 
Laravel Introduction
Laravel IntroductionLaravel Introduction
Laravel Introduction
 
Bootstrap 5 basic
Bootstrap 5 basicBootstrap 5 basic
Bootstrap 5 basic
 
UDA-Componentes RUP. Mantenimiento (v2.1.1 deprecado)
UDA-Componentes RUP. Mantenimiento  (v2.1.1 deprecado)UDA-Componentes RUP. Mantenimiento  (v2.1.1 deprecado)
UDA-Componentes RUP. Mantenimiento (v2.1.1 deprecado)
 
UDA-Componentes RUP. Combo
UDA-Componentes RUP. ComboUDA-Componentes RUP. Combo
UDA-Componentes RUP. Combo
 
Xml Schema
Xml SchemaXml Schema
Xml Schema
 
UDA-Plugin UDA. Guia de uso del plugin.
UDA-Plugin UDA. Guia de uso del plugin.UDA-Plugin UDA. Guia de uso del plugin.
UDA-Plugin UDA. Guia de uso del plugin.
 
Java Server Faces (JSF) - Basics
Java Server Faces (JSF) - BasicsJava Server Faces (JSF) - Basics
Java Server Faces (JSF) - Basics
 
UDA-Plugin UDA. Guia de desarrollo
UDA-Plugin UDA. Guia de desarrolloUDA-Plugin UDA. Guia de desarrollo
UDA-Plugin UDA. Guia de desarrollo
 
Ajax Ppt
Ajax PptAjax Ppt
Ajax Ppt
 
UDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingUDA-Componentes RUP. Reporting
UDA-Componentes RUP. Reporting
 
BEM it! Introduction to BEM methodology
BEM it! Introduction to BEM methodologyBEM it! Introduction to BEM methodology
BEM it! Introduction to BEM methodology
 
RESTful API 제대로 만들기
RESTful API 제대로 만들기RESTful API 제대로 만들기
RESTful API 제대로 만들기
 
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)
 

Destacado

Web services restful con JAX-RS
Web services restful con JAX-RSWeb services restful con JAX-RS
Web services restful con JAX-RSVortexbird
 
Introduccion a los Servicios Web Rest
Introduccion a los Servicios Web RestIntroduccion a los Servicios Web Rest
Introduccion a los Servicios Web RestDavid J. Brenes
 
Pilar Roch, ponencia del Congreso e-coned ‘El proceso de Emprender: La experi...
Pilar Roch, ponencia del Congreso e-coned ‘El proceso de Emprender: La experi...Pilar Roch, ponencia del Congreso e-coned ‘El proceso de Emprender: La experi...
Pilar Roch, ponencia del Congreso e-coned ‘El proceso de Emprender: La experi...El Norte de Castilla
 
Guia de estudio OCP Java SE 7 Programmer
Guia de estudio OCP Java SE 7 ProgrammerGuia de estudio OCP Java SE 7 Programmer
Guia de estudio OCP Java SE 7 ProgrammerOscar V
 
La naranja mecánica la película
La naranja mecánica la películaLa naranja mecánica la película
La naranja mecánica la películaMarcus Cho Chis
 
Desarrollo De Aplicaciones Para Facebook
Desarrollo De Aplicaciones Para FacebookDesarrollo De Aplicaciones Para Facebook
Desarrollo De Aplicaciones Para FacebookAndres Karp
 
Caso n2 naranja mecanica
Caso n2 naranja mecanicaCaso n2 naranja mecanica
Caso n2 naranja mecanicaZodiark Kaze
 
Analisis la naranja mecanica
Analisis   la naranja mecanicaAnalisis   la naranja mecanica
Analisis la naranja mecanicaNallely Sandoval
 
La Naranja MecáNica
La  Naranja  MecáNicaLa  Naranja  MecáNica
La Naranja MecáNicanue
 
Java WebServices JaxWS - JaxRs
Java WebServices JaxWS - JaxRsJava WebServices JaxWS - JaxRs
Java WebServices JaxWS - JaxRsHernan Rengifo
 
Cejv659 week09 glassfish-s14
Cejv659 week09 glassfish-s14Cejv659 week09 glassfish-s14
Cejv659 week09 glassfish-s14Ken Fogel
 
Desarrollando un API con REST
Desarrollando un API con RESTDesarrollando un API con REST
Desarrollando un API con RESTAlex Puig
 
Artefactos mayas demuestran contacto extraterrestre
Artefactos mayas demuestran contacto extraterrestreArtefactos mayas demuestran contacto extraterrestre
Artefactos mayas demuestran contacto extraterrestreidafe
 
Ips10 Optical inspection for small bores, by Jenoptik
Ips10  Optical inspection for small bores, by JenoptikIps10  Optical inspection for small bores, by Jenoptik
Ips10 Optical inspection for small bores, by JenoptikHommel Etamic (Jenoptik)
 
Rail Marketing doc PTC-Final
Rail Marketing doc PTC-FinalRail Marketing doc PTC-Final
Rail Marketing doc PTC-FinalJohn Gauthier
 
Hol tart a magyar mobilpiac?
Hol tart a magyar mobilpiac?Hol tart a magyar mobilpiac?
Hol tart a magyar mobilpiac?IAB Hungary
 
Elementos para diseñar una empresa de innovación de impacto
Elementos para diseñar una empresa de innovación de impactoElementos para diseñar una empresa de innovación de impacto
Elementos para diseñar una empresa de innovación de impactoPaula Cardenau
 
Aplicaciones para móviles
Aplicaciones para móviles Aplicaciones para móviles
Aplicaciones para móviles Jocrisol
 
CAPI PISOS AMARILLOS DE ECIJA
CAPI PISOS AMARILLOS DE ECIJACAPI PISOS AMARILLOS DE ECIJA
CAPI PISOS AMARILLOS DE ECIJAnuryjuande
 
NACS Newsletter II CEBH
NACS Newsletter II CEBHNACS Newsletter II CEBH
NACS Newsletter II CEBHAminah Sheikh
 

Destacado (20)

Web services restful con JAX-RS
Web services restful con JAX-RSWeb services restful con JAX-RS
Web services restful con JAX-RS
 
Introduccion a los Servicios Web Rest
Introduccion a los Servicios Web RestIntroduccion a los Servicios Web Rest
Introduccion a los Servicios Web Rest
 
Pilar Roch, ponencia del Congreso e-coned ‘El proceso de Emprender: La experi...
Pilar Roch, ponencia del Congreso e-coned ‘El proceso de Emprender: La experi...Pilar Roch, ponencia del Congreso e-coned ‘El proceso de Emprender: La experi...
Pilar Roch, ponencia del Congreso e-coned ‘El proceso de Emprender: La experi...
 
Guia de estudio OCP Java SE 7 Programmer
Guia de estudio OCP Java SE 7 ProgrammerGuia de estudio OCP Java SE 7 Programmer
Guia de estudio OCP Java SE 7 Programmer
 
La naranja mecánica la película
La naranja mecánica la películaLa naranja mecánica la película
La naranja mecánica la película
 
Desarrollo De Aplicaciones Para Facebook
Desarrollo De Aplicaciones Para FacebookDesarrollo De Aplicaciones Para Facebook
Desarrollo De Aplicaciones Para Facebook
 
Caso n2 naranja mecanica
Caso n2 naranja mecanicaCaso n2 naranja mecanica
Caso n2 naranja mecanica
 
Analisis la naranja mecanica
Analisis   la naranja mecanicaAnalisis   la naranja mecanica
Analisis la naranja mecanica
 
La Naranja MecáNica
La  Naranja  MecáNicaLa  Naranja  MecáNica
La Naranja MecáNica
 
Java WebServices JaxWS - JaxRs
Java WebServices JaxWS - JaxRsJava WebServices JaxWS - JaxRs
Java WebServices JaxWS - JaxRs
 
Cejv659 week09 glassfish-s14
Cejv659 week09 glassfish-s14Cejv659 week09 glassfish-s14
Cejv659 week09 glassfish-s14
 
Desarrollando un API con REST
Desarrollando un API con RESTDesarrollando un API con REST
Desarrollando un API con REST
 
Artefactos mayas demuestran contacto extraterrestre
Artefactos mayas demuestran contacto extraterrestreArtefactos mayas demuestran contacto extraterrestre
Artefactos mayas demuestran contacto extraterrestre
 
Ips10 Optical inspection for small bores, by Jenoptik
Ips10  Optical inspection for small bores, by JenoptikIps10  Optical inspection for small bores, by Jenoptik
Ips10 Optical inspection for small bores, by Jenoptik
 
Rail Marketing doc PTC-Final
Rail Marketing doc PTC-FinalRail Marketing doc PTC-Final
Rail Marketing doc PTC-Final
 
Hol tart a magyar mobilpiac?
Hol tart a magyar mobilpiac?Hol tart a magyar mobilpiac?
Hol tart a magyar mobilpiac?
 
Elementos para diseñar una empresa de innovación de impacto
Elementos para diseñar una empresa de innovación de impactoElementos para diseñar una empresa de innovación de impacto
Elementos para diseñar una empresa de innovación de impacto
 
Aplicaciones para móviles
Aplicaciones para móviles Aplicaciones para móviles
Aplicaciones para móviles
 
CAPI PISOS AMARILLOS DE ECIJA
CAPI PISOS AMARILLOS DE ECIJACAPI PISOS AMARILLOS DE ECIJA
CAPI PISOS AMARILLOS DE ECIJA
 
NACS Newsletter II CEBH
NACS Newsletter II CEBHNACS Newsletter II CEBH
NACS Newsletter II CEBH
 

Similar a Tutorial - REST con java (JAX-RS 2.0)

Programacion web java
Programacion web javaProgramacion web java
Programacion web javaCésar Ocampo
 
Introducción a Tomcat
Introducción a TomcatIntroducción a Tomcat
Introducción a TomcatIker Canarias
 
TEMA Nº 3: ELEMENTOS DE JSP
TEMA Nº 3: ELEMENTOS DE JSPTEMA Nº 3: ELEMENTOS DE JSP
TEMA Nº 3: ELEMENTOS DE JSPAnyeni Garay
 
Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsFreelancer
 
Servicios web
Servicios webServicios web
Servicios webitoomac02
 
Servicios web
Servicios webServicios web
Servicios webitoomac02
 
Guia de estudio para Oracle Certified Java EE 6 Web Component Developer
Guia de estudio para Oracle Certified Java EE 6 Web Component DeveloperGuia de estudio para Oracle Certified Java EE 6 Web Component Developer
Guia de estudio para Oracle Certified Java EE 6 Web Component DeveloperOscar V
 
Introducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaIntroducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaEudris Cabrera
 
Como usar ajax con jquery
Como usar ajax con jqueryComo usar ajax con jquery
Como usar ajax con jqueryiva29234
 
Aprendiendo AWS Lambda con API Gateway y DynamoDB
Aprendiendo AWS Lambda con API Gateway y DynamoDBAprendiendo AWS Lambda con API Gateway y DynamoDB
Aprendiendo AWS Lambda con API Gateway y DynamoDBAbimael Desales López
 
Sesion06 apuntes
Sesion06 apuntesSesion06 apuntes
Sesion06 apuntesAnthonyFisi
 
Servicios web java php-perl-google
Servicios web java php-perl-googleServicios web java php-perl-google
Servicios web java php-perl-googleJosue Hernandez
 

Similar a Tutorial - REST con java (JAX-RS 2.0) (20)

Programacion web java
Programacion web javaProgramacion web java
Programacion web java
 
Java Web - JSP
Java Web - JSPJava Web - JSP
Java Web - JSP
 
Introducción a Tomcat
Introducción a TomcatIntroducción a Tomcat
Introducción a Tomcat
 
TEMA Nº 3: ELEMENTOS DE JSP
TEMA Nº 3: ELEMENTOS DE JSPTEMA Nº 3: ELEMENTOS DE JSP
TEMA Nº 3: ELEMENTOS DE JSP
 
Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on Rails
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
 
introduccion a Ajax
introduccion a Ajaxintroduccion a Ajax
introduccion a Ajax
 
Resumen jee
Resumen jeeResumen jee
Resumen jee
 
Servicios web
Servicios webServicios web
Servicios web
 
Servicios web
Servicios webServicios web
Servicios web
 
Guia de estudio para Oracle Certified Java EE 6 Web Component Developer
Guia de estudio para Oracle Certified Java EE 6 Web Component DeveloperGuia de estudio para Oracle Certified Java EE 6 Web Component Developer
Guia de estudio para Oracle Certified Java EE 6 Web Component Developer
 
Introducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaIntroducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en Java
 
Java con Base de Datos
Java con Base de Datos Java con Base de Datos
Java con Base de Datos
 
Como usar ajax con jquery
Como usar ajax con jqueryComo usar ajax con jquery
Como usar ajax con jquery
 
Aprendiendo AWS Lambda con API Gateway y DynamoDB
Aprendiendo AWS Lambda con API Gateway y DynamoDBAprendiendo AWS Lambda con API Gateway y DynamoDB
Aprendiendo AWS Lambda con API Gateway y DynamoDB
 
Web Services JAX-RS RESTful y SOAP
Web Services JAX-RS RESTful y SOAPWeb Services JAX-RS RESTful y SOAP
Web Services JAX-RS RESTful y SOAP
 
JSP
JSPJSP
JSP
 
Sesion06 apuntes
Sesion06 apuntesSesion06 apuntes
Sesion06 apuntes
 
JSP
JSPJSP
JSP
 
Servicios web java php-perl-google
Servicios web java php-perl-googleServicios web java php-perl-google
Servicios web java php-perl-google
 

Más de Abimael Desales López

Tareas Programadas de Oracle con Toad 10
Tareas Programadas de Oracle con Toad 10Tareas Programadas de Oracle con Toad 10
Tareas Programadas de Oracle con Toad 10Abimael Desales López
 
File Processing - Batch Process Execution
File Processing - Batch Process ExecutionFile Processing - Batch Process Execution
File Processing - Batch Process ExecutionAbimael Desales López
 
File Processing - Process Execution Solution
File Processing - Process Execution SolutionFile Processing - Process Execution Solution
File Processing - Process Execution SolutionAbimael Desales López
 
Patrones de Integración Empresariales
Patrones de Integración EmpresarialesPatrones de Integración Empresariales
Patrones de Integración EmpresarialesAbimael Desales López
 
El mejor enfoque para una arquitectura orientada a servicios
El mejor enfoque para una arquitectura orientada a serviciosEl mejor enfoque para una arquitectura orientada a servicios
El mejor enfoque para una arquitectura orientada a serviciosAbimael Desales López
 
SOA: Principios de Diseño de Servicios - Parte II
SOA: Principios de Diseño de Servicios - Parte IISOA: Principios de Diseño de Servicios - Parte II
SOA: Principios de Diseño de Servicios - Parte IIAbimael Desales López
 
Analisis ¿No es eso para personas poco inteligentes?
Analisis ¿No es eso para personas poco inteligentes?Analisis ¿No es eso para personas poco inteligentes?
Analisis ¿No es eso para personas poco inteligentes?Abimael Desales López
 
Conceptos introductorios al diseño de Servicios SOA
Conceptos introductorios al diseño de Servicios SOAConceptos introductorios al diseño de Servicios SOA
Conceptos introductorios al diseño de Servicios SOAAbimael Desales López
 

Más de Abimael Desales López (17)

Tutorial - Ordenar listas Java
Tutorial   - Ordenar listas JavaTutorial   - Ordenar listas Java
Tutorial - Ordenar listas Java
 
Tareas Programadas de Oracle con Toad 10
Tareas Programadas de Oracle con Toad 10Tareas Programadas de Oracle con Toad 10
Tareas Programadas de Oracle con Toad 10
 
File Processing - Batch Process Execution
File Processing - Batch Process ExecutionFile Processing - Batch Process Execution
File Processing - Batch Process Execution
 
File Processing - Process Execution Solution
File Processing - Process Execution SolutionFile Processing - Process Execution Solution
File Processing - Process Execution Solution
 
Patrones de Integración Empresariales
Patrones de Integración EmpresarialesPatrones de Integración Empresariales
Patrones de Integración Empresariales
 
Jpa modelos de componentes
Jpa   modelos de componentesJpa   modelos de componentes
Jpa modelos de componentes
 
Integrando sonar
Integrando sonarIntegrando sonar
Integrando sonar
 
Apache Camel - Parte II
Apache Camel - Parte IIApache Camel - Parte II
Apache Camel - Parte II
 
Apache Camel
Apache CamelApache Camel
Apache Camel
 
Patrones de diseño
Patrones de diseñoPatrones de diseño
Patrones de diseño
 
Integración de Aplicaciones
Integración de AplicacionesIntegración de Aplicaciones
Integración de Aplicaciones
 
El mejor enfoque para una arquitectura orientada a servicios
El mejor enfoque para una arquitectura orientada a serviciosEl mejor enfoque para una arquitectura orientada a servicios
El mejor enfoque para una arquitectura orientada a servicios
 
Orquestación de Servicios y SOA
Orquestación de Servicios y SOAOrquestación de Servicios y SOA
Orquestación de Servicios y SOA
 
SOA: Principios de Diseño de Servicios - Parte II
SOA: Principios de Diseño de Servicios - Parte IISOA: Principios de Diseño de Servicios - Parte II
SOA: Principios de Diseño de Servicios - Parte II
 
Orquestación o coreografía
Orquestación o coreografíaOrquestación o coreografía
Orquestación o coreografía
 
Analisis ¿No es eso para personas poco inteligentes?
Analisis ¿No es eso para personas poco inteligentes?Analisis ¿No es eso para personas poco inteligentes?
Analisis ¿No es eso para personas poco inteligentes?
 
Conceptos introductorios al diseño de Servicios SOA
Conceptos introductorios al diseño de Servicios SOAConceptos introductorios al diseño de Servicios SOA
Conceptos introductorios al diseño de Servicios SOA
 

Tutorial - REST con java (JAX-RS 2.0)

  • 1. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez REST con Java usando Jersey Presenta Ing. Abimael Desales López https://www.facebook.com/JavaDevelopersMexico JavaDevelopersMexico en Google + “El conocimiento es libre y está en búsqueda de que lo hagas tuyo, sólo necesitas práctica y paciencia”
  • 2. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez Tutorial - REST con Java (JAX-RS) usando Jersey Copyright © 2015 JavaDevelopersMexico 10/08/2015 Web services RESTful con Java (Jersey / JAX-RS) Este tutorial explica cómo desarrollar web services RESTful en Java con Jersey la implementación de referencia de JAX-RS. En este tutorial usamos los siguientes artefactos de software  Eclipse 4.4 (Luna)  Java 1.8.0_45,  Tomcat 7.0  JAX-RS 2.0 (con Jersey 2.19). Tabla de Contenido Audiencia 1. REST - Representational State Transfer 1.1. ¿Qué esREST? 1.2. MétodosHTTP 1.3. WebServicesRESTFul 2. JAX-RScon Jersey 2.1. JAX-RS 2.2. Jersey 2.3. AnotacionesJAX-RS 3. Instalaciónde Jersey 4. ContenedorWeb 5. Prerrequisitos 6. Crea tu primerWebservice RESTful 6.1. Creaun nuevoproyectoweb 6.2. AgregalosJARsde Jersey 6.3. Clase Java 6.4. Define el Servletdispatcherde Jersey 6.5. Corre tu servicio rest 7. Crea un cliente 8. Web services RESTful yJAXB 8.1. Creaun proyecto 8.2. Creaun cliente 9. Webservice RESTful CRUD
  • 3. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez 9.1. Proyecto 9.2. Creaun formularioHTML simple 9.3. ServicioRest 9.4. Corre 9.5. Creaun cliente 9.6. Usandoel servicioRESTvía unapágina HTML BibliografíayWebgrafía Audiencia Este tutorial está diseñado para profesionales de software quienes quieren aprender sobre servicios web RESTful en pasos simples y fáciles. Este tutorial te proporcionará conocimientos sobre los conceptos de servicios web RESTful, y después de completar este tutorial estarás en un nivel intermedio de expertise desde donde puedes subir por ti mismo a un nivel de expertise más alto a través de la práctica. 1. REST - Representational State Transfer 1.1. ¿Qué es REST? REST es un estilo arquitectural que está basado en estándares web y el protocolo HTTP. REST fue descrito por primera vez por Roy Fielding en el 2000. En una arquitectura REST todo es un recurso. Un recurso es accesado vía una interfaz común basada en los métodos HTTP estándar. En una arquitectura basada en REST generalmente tienes un servidor REST que proporciona acceso a los recursos y un cliente REST que accesa y modifica los recursos REST. Cada recurso debe soportar las operaciones HTTP comunes. Los recursos son identificados por IDs globales (las cuales típicamente son URIs). REST permite que los recursos tengan diferentes representaciones, p.e., texto, XML, JSON, etc. El cliente REST puede preguntar por una representación específica vía el protocolo HTTP (negociación de contenido). 1.2. Métodos HTTP Los métodos PUT, GET, POST DELETE, y OPTIONS generalmente son usados en arquitecturas basadas en REST.
  • 4. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez La siguiente tabla proporciona una explicación de estas operaciones. GET Define un acceso de lectura del recurso sin efectos colaterales. El recurso nunca es cambiado vía una request GET, p.e., la request no tiene efectos colaterales (idempotente). PUT Crea un nuevo recurso. También de debe ser idempotente DELETE Usado para remover un recurso. Las operaciones son idempotentes. Pueden ser repetidas sin llevar a diferentes resultados. POST Usado para actualizar un recurso existente o crear un nuevo recurso OPTIONS Usado para obtener las operaciones soportadas por un recurso 1.3. Web services RESTFul Los web services RESTFul están basados en métodos HTTP y el concepto de REST. Un web service RESTFul típicamente define la URI base URI para los servicios, los tipos MIME soportados (XML, text, JSON, definido por el usuario,...) y el conjunto de operaciones (POST, GET, PUT, DELETE) que son soportadas. 2. JAX-RS con Jersey 2.1. JAX-RS Java define el soporte de REST vía la Java Specification Request (JSR) 311. Esta especificación es llamada JAX-RS (la Java API for RESTful Web Services). JAX-RS usa anotaciones para definir la relevancia de REST en las clases Java. 2.2. Jersey Jersey es implementación de referencia para la especificación JSR 311. La implementación Jersey provee una librería para implementar webservices Restful en un contenedor de servlets Java. En el lado del servidor Jersey provee una implementación de servlet que escanea las clases predefinidas para identificar los recursos RESTful. En tu archivo de configuración web.xml debes registrar este servlet para tu aplicación web.
  • 5. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez La implementación Jersey también proporciona una librería cliente para comunciarse con un webservice RESTful. La URL base de este servlet es: http://tu_dominio:puerto/nombre-despliegue/url-pattern/path_de_clases_rest Este servlet analiza la request HTTP entrante y selecciona la clase correcta y método para responder a esta request. Esta selección está basada en anotaciones en la clase y métodos. Una aplicación web REST consiste, por lo tanto, de clases (recursos) y servicios. Estos dos tipos típicamente son mantenidos en diferentes packages ya que el servlet Jersey será instruido vía el web.xml para que escanee ciertos packages para las clases de datos. JAX-RS soporta la creación de XML y JSON vía la Java Architecture for XML Binding (JAXB). 2.3. Anotaciones JAX-RS Las anotaciones más importantes en JAX-RS son listados en la siguiente tabla. Tabla 1. Anotaciones JAX-RS Anotación Descripción @PATH(tu_path) Asigna el path a la URL base + /tu_path. La URL base está basada en el nombre de tu aplicación,el servlet y la URL pattern del archivo de configuración web.xml. @POST Indica que el método siguiente responderá a una request POST HTTP. @GET Indica que el método siguiente responderá a una request GET HTTP. @PUT Indica que el siguiente método responderá a una requestPUT HTTP. @DELETE Indica que el siguiente método responderá a una request DELETE HTTP. @Produces(MediaType.TEXT_PLAIN[, more-types]) @Produces define qué tipo MIME es entregado por un método anotado con @GET. En el ejemplo se produce texto ("text/plain"). Otros ejemplos serían "application/xml"o "application/json". @Consumes(type[, mas-tipos]) @Consumes define qué tipo MIME es consumido por este método. @PathParam Usado para inyectar valores de la URL en un parámetro del método. De esta forma inyectas,por ejemplo,el ID de un recurso en el método para obtener el objeto correcto.
  • 6. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez El path completo a un recurso está basado en la URL base y la anotación @PATh en tu clase. http://tu_dominio:puerto/nombre-despliegue/url-pattern/path_de_clases_rest 3. Instalación de Jersey Descarga la distribución Jersey como archivo zip desde el sitio de descarga de Jersey. El zip contiene el JAR de la implementación Jersey y sus dependencias core. No proporciona dependencias para JArs de tecerceros más allá de aquellos para el soporte de JSON y JavaDoc. 4. Contenedor Web Para este tutorial puedes usar cualquier contenedor web, por ejemplo Tomcat o la Google App Engine. Si quieres usar Tomcat como contenedor de servlet por favor mira Eclipse WTP y Apache Tomcat para las instrucciones sobre cómo instalar y usar Eclipse WTP y Apache Tomcat. Alternativamente también podrías usar la Google App Engine para correr la parte del servidor de los siguientes ejemplos de REST. Si usas la Google App Engine, no tienes que instalar y configure Tomcat. Tip Si estás usando GAE/J, tienes que crear proyectos de App Engine en vez de Dynamic Web Project. La siguiente descripción está basada en Apache Tomcat. 5. Prerrequisitos Antes de proceder con este tutorial debes tener una comprensión básica del lenguaje Java, editores de texto, IDEs, servidores web, etc. Debido a que vamos a desarrollar aplicaciones de web services usando RESTful, será bueno que tengas conocimientos sobre otras tecnologías web como HTML, CSS, AJAX etc. 6. Crea tu primer Webservice RESTful 6.1. Crea un nuevo proyecto web Crea un nuevo Dynamic Web Project llamado it.adesales.primer.rest.
  • 7. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez Haz click en Next
  • 8. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez Asegúrate de crear el descriptor de deployment web.xml.
  • 9. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez Seleccionando la casilla Generate web.xml deployment descriptor y además cambia el nombre de content directory por Web en vez de WebContent para estandarizar la aplicación. 6.2. Agrega los JARs de Jersey Copia todos los JARs de tu descarga de Jersey (los que hay dentro de las tres carpetas de librerías, api, ext y lib) en la carpeta WEB-INF/lib.
  • 10. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez 6.3. Clase Java Crea la siguiente clase Java en el package it.adesales.primer.rest.
  • 11. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez package it.adesales.primer.rest; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; // Plain old Java Object no extienden de clases o implementan una interface // La clase registra sus métodos para la request GET HTTP usando la anotación @GET. // Usando la anotación @Produces, define que puede entregar varios tipos MIME, texto // XML y HTML. // Por defaul, el navegador solicita el tipo MIME HTML. //Asigna el path a la URL base + /hola @Path("/hola") public class Hola { // Este método es llamado si se solicita TEXT_PLAIN @GET @Produces(MediaType.TEXT_PLAIN) public String sayPlainTextHola() { return "Hola Jersey"; } // Este método es llamado si se solicita XML @GET @Produces(MediaType.TEXT_XML) public String sayXMLHola() { return "<?xml version="1.0"?>" + "<hello> Hola Jersey" + "</hello>"; } // Este método es llamado si se solicita HTML @GET @Produces(MediaType.TEXT_HTML) public String sayHtmlHola() { return "<html> " + "<title>" + "Hola Jersey" + "</title>" + "<body><h1>" + "Hola Jersey" + "</body></h1>" + "</html> "; } } Esta clase se registra a sí misma como un recurso get vía la anotación @GET. Vía la anotación @Produces define que entrega el texto y los tipos MIME HTML. Además define vía la anotación @Path que sus servicios están disponibles bajo la URL hola. El navegador siempre solicitará el tipo MIME HTML. Para ver la versión texto, puedes usar alguna herramienta como curl. 6.4. Define el despachador de Servlet de Jersey Necesitas registrar Jersey como el despachador de servlet para solicitudes REST. Abre el archivo web.xml y modifícalo a lo siguiente. <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>it.adesales.primer.rest</display-name> <servlet>
  • 12. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <!-- Registra recursos y proveedores bajo package com.vogella.jersey.first.--> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>it.adesales.primer.rest</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app> El parámetro jersey.config.server.provider.packages define en qué package buscará Jersey clases de web service. Esta propiedad debe apuntar a tus clases de recursos. El URL pattern define la parte de la URL base donde tu aplicación será colocada. 6.5. Corre tu servicio rest Corre tu aplicación web en Eclipse. Debes ser capaz de accesar tus recursos bajo la siguiente URL en el navegador: http://localhost:8080/it.adesales.primer.rest/rest/hola En mi caso también pruebo con una herramienta de nombre Postman, disponible para Chrome, recomiendo que la utilicen y jueguen con ella para que se familiaricen:
  • 13. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez Este nombre es derivado del "display-name" definido en el archivo web.xml, aumentado con el URL-pattern del servlet-mapping y la anotación @Path hola de tu archivo de clase. Debes obtener el mensaje "Hola Jersey". El navegador solicita la representación HTML de tu recurso. En el siguiente capítulo vamos a escribir un cliente que leerá la representación XML. 7. Crea un cliente Jersey contiene una librería cliente REST que se puede usar para probar o construir un cliente real en Java. El uso de esta librería es demostrado en el siguiente ejercicio. Crea un nuevo proyecto Java y agrega el package it.adesales.primer.rest.cliente y agrega los JARs de Jersey al proyecto y al build path del proyecto. Crea la siguiente clase de test. package it.adesales.primer.rest.cliente; import java.net.URI; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import org.glassfish.jersey.client.ClientConfig; public class Test { public static void main(String[] args) { ClientConfig config = new ClientConfig(); Client client = ClientBuilder.newClient(config); WebTarget target = client.target(getBaseURI()); String response = target.path("rest"). path("hola"). request(). accept(MediaType.TEXT_PLAIN). get(Response.class) .toString(); String plainAnswer = target.path("rest").path("hola").request().accept(MediaType.TEXT_PLAIN).get(String.class); String xmlAnswer = target.path("rest").path("hola").request().accept(MediaType.TEXT_XML).get(String.class); String htmlAnswer= target.path("rest").path("hola").request().accept(MediaType.TEXT_HTML).get(String.class); System.out.println(response); System.out.println(plainAnswer); System.out.println(xmlAnswer); System.out.println(htmlAnswer); } private static URI getBaseURI() { return UriBuilder.fromUri("http://localhost:8080/it.adesales.primer.rest").build(); }
  • 14. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez } 8. Web services RESTful y JAXB JAX-RS soporta la creación automática de XML y JSON vía JAXB. Si deseas una introducción en XML por favor revisa el Tutorial Java y XML. Si deseas una introducción en JAXB por favor revisa JAXB. Puedes continuar este tutorial sin leer estos tutoriales, pero ellos contienen más información de fondo si quieres conocer mas sobre dichos temas. 8.1. Crea el proyecto Crea un nuevo Dynamic Web Project llamado it.adesales.rest.jaxb. Asegúrate de seleccionar el check para generar el descritor de deployment web.xml y renombrar la carpeta WebContent a Web, como en el ejemplo anterior. Copia todos los JARs de Jersey JARs a la carpeta WEB-INF/lib. Crea tu clase de dominio Todo bajo el package it.adesales.rest.jaxb.model. package it.adesales.rest.jaxb.model; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement // JAX-RS soporta un mapeo automático de clases JAXB anotadas a XML y JSON // ¿No es esto cool? public class Todo {
  • 15. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez private String resumen; private String descripcion; public String getResumen() { return resumen; } public void setResumen(String resumen) { this.resumen = resumen; } public String getDescripcion() { return descripcion; } public void setDescripcion(String descripcion) { this.descripcion = descripcion; } } Crea la siguiente clase de recurso. Esta clase simplemente retorna una instancia de la clase Todo. package it.adesales.rest.jaxb.service; import it.adesales.rest.jaxb.model.Todo; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/todo") public class TodoRecurso {
  • 16. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez // Este método es llamado si la request es XML @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public Todo getXML() { Todo todo = new Todo(); todo.setResumen("Este es mi primer todo XML"); todo.setDescripcion("Este es mi primer todo XML"); return todo; } // Esto puede ser usado para probar la integración con el navegador @GET @Produces({ MediaType.TEXT_XML }) public Todo getHTML() { Todo todo = new Todo(); todo.setResumen("Este es mi primer todo HTML"); todo.setDescripcion("Este es mi primer todo HTML"); return todo; } } Cambia tu web.xml a lo siguiente. <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>it.adesales.rest.jaxb</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <!-- Register resources and providers under com.vogella.jersey.first package. --> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>it.adesales.rest.jaxb.service</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app> Corre tu aplicación web en Eclipse y valida que puedes accesar tu servicio. Tu aplicación debe estar disponible bajo la siguiente URL. http://localhost:8080/com.vogella.jersey.jaxb/rest/todo
  • 17. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez 8.2. Crea un cliente Crea un nuevo proyecto Java it.adesales.rest.jaxb.client y agrega los JARs de Jersey al proyecto y al build path del proyecto. Crea la siguiente clase de test. package it.adesales.rest.jaxb.client; import java.net.URI; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriBuilder; import org.glassfish.jersey.client.ClientConfig; public class TodoTest { public static void main(String[] args) { ClientConfig config = new ClientConfig(); Client client = ClientBuilder.newClient(config); WebTarget target = client.target(getBaseURI()); // Obtiene el XML String htmlResponse = target.path("rest").path("todo").request() .accept(MediaType.TEXT_XML).get(String.class); // Obtiene el XML para la aplicación String xmlResponse = target.path("rest").path("todo").request() .accept(MediaType.APPLICATION_XML).get(String.class); // Para una response JSON también agrega las librerías de Jackson a tu //aplicación web. En este caso también cambiarías el registro del cliente a // ClientConfig config = new ClientConfig().register(JacksonFeature.class); // Get JSON for application // System.out.println(target.path("rest").path("todo").request() // .accept(MediaType.APPLICATION_JSON).get(String.class)); System.out.println(htmlResponse); System.out.println(xmlResponse); } private static URI getBaseURI() { return UriBuilder.fromUri(“http://localhost:8080/it.adesales.rest.jaxb“).build(); } }
  • 18. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez 9. Webservice RESTful CRUD En esta sección vamos a crear un web service RESTful CRUD (Create, Read, Update, Delete). Permitirá mantener una lista de TODOs en tu aplicación web vía llamadas HTTP. 9.1. Proyecto Crea un nuevo dynamic web project llamado it.adesales.rest.jaxb.crud y agrega las librerías de Jersey. Cambia el archivo web.xml al siguiente. <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>it.adesales.rest.crud</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <!-- Registar recursos y proveedores bajo com.vogella.jersey.first --> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>it.adesales.rest.crud.recursos</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app> Crea el siguiente modelo de datos y un Singleton que sirve como el proveedor de datos para el modelo. Nosotros usamos la implementación basada en una enumeración, puedes probar con otras opciones como usar objetos Mocks. Por favor revisa los links para más detalles. La clase Todo está anotada con una anotación JAXB. Véase Java y XML para aprender sobre JAXB. package it.adesales.rest.crud.model; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Todo { private String id; private String resumen; private String descripcion; public Todo(){} public Todo (String id, String resumen){ this.id = id; this.resumen = resumen; } public String getId() { return id; }
  • 19. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez public void setId(String id) { this.id = id; } public String getResumen() { return resumen; } public void setResumen(String resumen) { this.resumen = resumen; } public String getDescripcion() { return descripcion; } public void setDescripcion(String descripcion) { this.descripcion = descripcion; } } package it.adesales.rest.crud.dao; import java.util.HashMap; import java.util.Map; import it.adesales.rest.crud.model.Todo; public enum TodoDao { instance; private Map<String, Todo> contentProvider = new HashMap<>(); private TodoDao() { Todo todo = new Todo("1", "Aprende REST"); todo.setDescripcion("Lee mi artículo completo"); contentProvider.put("1", todo); todo = new Todo("2", "Haz algo"); todo.setDescripcion("Visita mis sitios de Java Developers México"); contentProvider.put("2", todo); } public Map<String, Todo> getModel(){ return contentProvider; } } 9.2. Crea un formulario HTML simple El servicio REST puede usarse vía formularios HTML. El siguiente formulario HTML permitirá postear nuevos datos al servicio. Crea una carpeta de nombre pages dentro de la carpeta Web y dentro de esta crea la siguiente página llamada crea_todo.html. <!DOCTYPE html> <html> <head> <title>Formulario para crear un nuevo recurso</title> </head>
  • 20. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez <body> <form action="../it.adesales.rest.crud/rest/todos" method="POST"> <label for="id">ID</label> <input name="id" /> <br/> <label for="resumen">Resumen</label> <input name="resumen" /> <br/> Descripción: <TEXTAREA NAME="descripcion" COLS=40 ROWS=6></TEXTAREA> <br/> <input type="submit" value="Submit" /> </form> </body> </html> 9.3. Servicio Rest Crea las siguientes clases que se usarán como recursos REST. package it.adesales.rest.crud.recursos; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import javax.xml.bind.JAXBElement; import it.adesales.rest.crud.dao.TodoDao; import it.adesales.rest.crud.model.Todo; public class TodoRecurso { @Context UriInfo uriInfo; @Context Request request; String id; public TodoRecurso(UriInfo uriInfo, Request request, String id) { this.uriInfo = uriInfo; this.request = request; this.id = id; } //Integración de la Aplicación @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Todo getTodo() { Todo todo = TodoDao.instance.getModel().get(id); if(todo==null) throw new RuntimeException("Get: Todo con " + id + " no encontrado"); return todo; } // para el navegador @GET @Produces(MediaType.TEXT_XML)
  • 21. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez public Todo getTodoHTML() { Todo todo = TodoDao.instance.getModel().get(id); if(todo==null) throw new RuntimeException("Get: Todo con " + id + " no encontrado "); return todo; } @PUT @Consumes(MediaType.APPLICATION_XML) public Response putTodo(JAXBElement<Todo> todo) { Todo c = todo.getValue(); return putAndGetResponse(c); } @DELETE public void deleteTodo() { Todo c = TodoDao.instance.getModel().remove(id); if(c==null) throw new RuntimeException("Delete: Todo con " + id + " no encontrado"); } private Response putAndGetResponse(Todo todo) { Response res; if(TodoDao.instance.getModel().containsKey(todo.getId())) { res = Response.noContent().build(); } else { res = Response.created(uriInfo.getAbsolutePath()).build(); } TodoDao.instance.getModel().put(todo.getId(), todo); return res; } } package it.adesales.rest.crud.recursos; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.Consumes; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; import javax.ws.rs.core.UriInfo; import com.vogella.jersey.todo.dao.TodoDao; import com.vogella.jersey.todo.model.Todo; // Mapeará el recurso a la URL todos @Path("/todos") public class TodosRecurso { // Permite insertar objetos contextuales en la clase, // p.e. ServletContext, Request, Response, UriInfo @Context UriInfo uriInfo;
  • 22. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez @Context Request request; // Retorna la lista de todos al usuario en el browser @GET @Produces(MediaType.TEXT_XML) public List<Todo> getTodosBrowser() { List<Todo> todos = new ArrayList<Todo>(); todos.addAll(TodoDao.instance.getModel().values()); return todos; } // Retorna la lista de todos para las aplicaciones @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public List<Todo> getTodos() { List<Todo> todos = new ArrayList<Todo>(); todos.addAll(TodoDao.instance.getModel().values()); return todos; } // retorna el número de todos // Usa http://localhost:8080/it.adesales.rest.crud/rest/todos/conteo // para obtener el número total de registros @GET @Path("conteo") @Produces(MediaType.TEXT_PLAIN) public String getCount() { int count = TodoDao.instance.getModel().size(); return String.valueOf(count); } @POST @Produces(MediaType.TEXT_HTML) @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public void newTodo(@FormParam("id") String id, @FormParam("resumen") String resumen, @FormParam("descripcion") String descripcion, @Context HttpServletResponse servletResponse) throws IOException { Todo todo = new Todo(id, resumen); if (descripcion != null) { todo.setDescripcion(descripcion); } TodoDao.instance.getModel().put(id, todo); servletResponse.sendRedirect("../crea_todo.html"); } // Define que el siguiente parámetro path después de todos es tratado // como un parámetro y pasado al TodoResources // Permite al type http://localhost:8080/it.adesales.rest.crud/rest/todos/1 // 1 será tratado como parámetro todo y pasado a TodoResource @Path("{todo}") public TodoRecurso getTodo(@PathParam("todo") String id) { return new TodoRecurso(uriInfo, request, id); } } Este TodosRecurso usa la anotación @PathParam para definir que el id es insertado como parámetro.
  • 23. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez 9.4. Corre Corre tu aplicación web en Eclipse y prueba la disponibilidad de tu servicio REST bajo: http://localhost:8080/it.adesales.rest.crud/rest/todos. Debes ver la representación XML de tus elementos TODO. Para ver el conteo de los elementos de TODO usa la dirección http://localhost:8080/it.adesales.rest.crud/rest/todos/conteo para ver un TODO existente usa "http://localhost:8080/it.adesales.rest.crud/rest/todos/{id}", p.e., http://localhost:8080/it.adesales.rest.crud/rest/todos/1 para ver el TODO con ID 1. Actualmente tenemos sólo TODOs con los ids 1 y 2, todas las otras requests darán como resultado un código de error HTTP. En la siguiente pantalla se muestra la versión solicitada en XML del todo con id=1.
  • 24. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez En la siguiente pantalla se muestra el todo con id=2 desde la herramienta de chrome Postman. La siguiente pantalla es de una request POST, ingresando los parámetros y el Content-Type por la herramienta Postman.
  • 25. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez Si consultamos los recursos disponibles después de haber emitido la request POST a través de la herramienta Postman, podremos ver lo siguiente desde el navegador o la misma tool: Por favor, nota que con el navegador sólo puedes emitir solicitudes GET HTTP. En el siguiente capítulo usaremos las librerías cliente de Jersey para emitir get, post y delete. Sólo quisiera hacer una aclaración, debido a que otra aplicación ocupa el puerto 8080 de mi equipo, he tenido que cofigurar Tomcat para que ocupe el puerto 80 en vez del 8080 que trae por default, por ello en mis requests después de localhost omito el puerto ya que es el default 80 donde un equipo escucha requests HTTP. Puedes omitir el siguiente punto si utilizas la herramienta Postman ya que es el cliente. 9.5. Crea un cliente Para probar tu servicio puedes crear una nueva clase en el proyecto servidor. Este proyecto ya tiene todas las librerías requeridas en el classpath, de forma que este es más rápido que crear un nuevo proyecto.
  • 26. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez Crea la siguiente clase. package com.vogella.jersey.todo.client; import java.net.URI; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Form; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import org.glassfish.jersey.client.ClientConfig; import it.adesales.rest.crud.model.Todo; public class Tester { public static void main(String[] args) { ClientConfig config = new ClientConfig(); Client client = ClientBuilder.newClient(config); WebTarget service = client.target(getBaseURI()); // crea un todo Todo todo = new Todo("3", "Blabla"); Response response = service.path("rest").path("todos").path(todo.getId()).request(MediaType.APPLICATI ON_XML).put(Entity.entity(todo,MediaType.APPLICATION_XML),Response.class); // El código de retorno debe ser 201 == recurso creado System.out.println(response.getStatus()); // Obtén los Todos System.out.println(service.path("rest").path("todos").request().accept(MediaType. TEXT_XML).get(String.class)); // // Obtén JSON para la aplicación // System.out.println(service.path("rest").path("todos").request().accept(MediaType. APPLICATION_JSON).get(String.class)); // Obtiene el XML para la aplicación System.out.println(service.path("rest").path("todos").request().accept(MediaType. APPLICATION_XML).get(String.class)); //Obtiene Todo con id 1 Response checkDelete = service.path("rest").path("todos/1").request().accept(MediaType.APPLICATION_XML). get(); //Elimina Todo con id 1 service.path("rest").path("todos/1").request().delete(); //Obtiene todos los Todos con id 1 quedeben ser eliminados System.out.println(service.path("rest").path("todos").request().accept(MediaType. APPLICATION_XML).get(String.class)); //Crea un Todo
  • 27. Tutorial - REST con Java (JAX-RS) usando Jersey www.facebook.com/JavaDevelopersMexico Ing. Abimael DesalesLópez Form form =new Form(); form.param("id", "4"); form.param("resumen","Demostración de la librería cliente para formularios"); response = service.path("rest").path("todos").request().post(Entity.entity(form,MediaType.AP PLICATION_FORM_URLENCODED),Response.class); System.out.println("Response del formulario" + response.getStatus()); //Obtiene todos los todos, id 4 deben haber sido creados System.out.println(service.path("rest").path("todos").request().accept(MediaType. APPLICATION_XML).get(String.class)); } private static URI getBaseURI() { return UriBuilder.fromUri("http://localhost:8080/it.adesales.rest.crud").build(); } } 9.6. Usando el servicio REST vía página HTML El ejemplo anterior contiene un formulario que llama a un método post de tu servicio rest. Bibliografía y Webgrafía El presente artículo ha sido conformado por ejemplos de libros y de artículos de la web, de los cuales se pretende ofrecer lo mejor de cada uno, una mención especial a la página de Lars Vogel y a tutorialespoint.com, gracias por sus buenos artículos, ha sido el comienzo y aquí hemos buscado mejorarlos, estos se mencionan a continuación: 1.- http://www.vogella.com/ 2.- http://www.tutorialspoint.com/ 3.- https://es.wikipedia.org/wiki/Representational_State_Transfer 4.- Kalali Masoudy Bhakti Mehta, DevelopingRESTful Serviceswith JAXRS2.0,WebSocketsand JSON,PACKTPublishing,UK, 2013, 128 p. 5.- Burke, Bill. RESTful JavawithJAXRS2.0. O’Really Editorial,SecondEdition, USA, 2014, 392 p. Siéntete libre de escribirme yhacerme llegartusopiniones.