COMPUTACIÓN Y CÁLCULO NUMÉRICO Licenciatura en Física – Depto Física ECEN (FCEIA–UNR)
Presentación de PowerPoint · 2012-12-13 · Experto Universitario Java Enterprise © 2012-2013...
Transcript of Presentación de PowerPoint · 2012-12-13 · Experto Universitario Java Enterprise © 2012-2013...
Experto Universitario Java Enterprise
© 2012-2013 Depto. Ciencia de la Computación e IA
Componentes web
Sesión 11: Introducción a los Servicios Web RESTful
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Índice• Fundamentos de REST• Tipos de peticiones HTTP• Invocación de servicios• Estructuras JSON• Implementación de servicios REST con Jersey
2
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Fundamentos de REST
• REST: REpresentational State Transfer. Son un conjunto de restricciones que, aplicadas al diseño de un sistema, crean un estilo arquitectónico caracterizado por:• Debe ser un sistema cliente-servidor• Tiene que ser sin estado• Tiene que soportar cachés• Tiene que ser un sistema uniformemente accesible (a través de URIs)• Tiene que ser un sistema por capas (escalabilidad)
• Estas restricciones no dictan qué tipo de tecnología utilizar. Podemos utilizar las infraestructuras de red existentes• Un ejemplo de sistema RESTful: la web estática
3
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Recursos• Un recurso es “cualquier cosa” que pueda ser accedido y
transferido a través de la red:
• Es una correspondencia lógica y temporal con un concepto del domino del problema
• Ejemplos: una noticia de un periódico, la temperatura de Alicante, un valor de IVA almacenado en una BD...
• Cada uno de los recursos puede ser accedido directamente, y de forma independiente, pero diferentes peticiones podrían “apuntar” al mismo dato
• La representación de un recurso depende del tipo solicitado por el cliente (tipo MIME)
4
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Representación• Lo que se intercambia entre los consumidores (clientes) y los
productores de servicios son representaciones de los recursos.• Una representación muestra el estado de un dato real
almacenado en algún dispositivo de almacenamiento en el momento de la petición
• Durante el ciclo de vida del servicio web, puede haber varios clientes solicitando recursos. Clientes diferentes pueden solicitar diferentes representaciones del mismo recurso
• El “lenguaje” de intercambio de información (representación) con el servicio queda a elección del desarrollador
• Ejemplos de representaciones comunes son:
5
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
URI• Una URI (Uniform Resource Identifier), en un servicio web
RESTful es un hiper-enlace a un recurso, y es la única forma de intercambiar representaciones entre clientes y servidores
• En un sistema REST la URI no cambia a lo largo del tiempo• Si, por ejemplo, en nuestro sistema tenemos información de
cursos, podríamos acceder a una lista de cursos disponibles mediante la siguiente URL:• http://jtech.ua.es/resources/cursos• Esto nos podría devolver un documento como el siguiente:
6
<?xml version="1.0"?><j:Cursos xmlns:j="http://www.jtech.ua.es" xmlns:xlink="http://www.w3.org/1999/xlink"> <Curso id="1" xlink:href="http://jtech.ua.es/resources/cursos/1"/> <Curso id="2" xlink:href="http://jtech.ua.es/resources/cursos/2"/> <Curso id="4" xlink:href="http://jtech.ua.es/resources/cursos/4"/> <Curso id="6" xlink:href="http://jtech.ua.es/resources/cursos/6"/></j:Cursos>
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Uniformidad de las interfaces• El desarrollo de REST está centrado en el concepto de nombres
(intercambio de recursos)• Un servicio RESTful modifica el estado de los datos a través de
la representación de los recursos• Un servicio RESTful limita la ambigüedad en el diseño y la
implementación restringiendo las operaciones que podemos realizar con los recursos: create, retrieve, update, delete• La correspondencia de estas acciones con métodos HTTP son:
7
Un servicio REST puede ejecutar lógica en el lado del servidor, pero cada respuesta debe ser una representación del recurso del dominio en cuestión
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Obtención de recursos
• Supongamos que tenemos las siguientes representaciones XML
8
http://restful.java/students/Janehttp://restful.java/students
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
GET/RETRIEVE
• http://restful.java/students/Jane con el método GET• Seguro e idempotente
9
200 OkDevuelve el recurso
404 Not found Si no existe el recurso
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
POST/CREATE
• http://restful.java/students/ con el método POST• No idempotente
10
201 CreateNuevo recurso creado
Location URI del recurso
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
PUT/UPDATE
• http://restful.java/students/Jane con el método PUT• Idempotente
11
204 No contentRecurso modificado
201 Created Nuevo recurso creado
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
DELETE/DELETE
• http://restful.java/students/Jane con el método DELETE
12
200 OkDevuelve el recurso borrado
204 No content
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Invocación desde una clase Java• Cliente RESTful de Twitter
13
public class ClienteTwitter { public static void main(String[] args) { try { URL twitter = new URL("http://twitter.com/statuses/public_timeline.xml"); // Abrimos la conexión URLConnection tc = twitter.openConnection(); // Obtenemos la respuesta del servidor BufferedReader in = new BufferedReader(new InputStreamReader( tc.getInputStream())); String line; // Leemos la respuesta del servidor y la imprimimos while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Resultado obtenido
• Mostramos parte de uno de los tweets
14
<?xml version="1.0" encoding="UTF-‐8"?> <statuses type="array"> ... <status> <created_at>Tue Feb 22 11:43:25 +0000 2011</created_at> <id>40013788233216000</id> <text>Haar doen voor de cam. #ahahah</text> <source>web</source> <truncated>false</truncated> <favorited>false</favorited> <in_reply_to_status_id></in_reply_to_status_id> <in_reply_to_user_id></in_reply_to_user_id> <in_reply_to_screen_name></in_reply_to_screen_name> <retweet_count>0</retweet_count> <retweeted>false</retweeted> <user> ... </user> </status>...</statuses>
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Invocación con HttpClient• En lugar de utilizar el paquete estándar java.net, utilizamos la
librería de Jakarta Commons
15
public class ClienteTwitter { public static void main(String[] args) { HttpClient client = new HttpClient(); GetMethod method = new GetMethod( "http://twitter.com/statuses/public_timeline.xml"); try { int statusCode = client.executeMethod(method); if (statusCode == HttpStatus.SC_OK) { System.out.println(new String(method.getResponseBody())); } } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { method.releaseConnection(); } }}
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Invocación desde un JSP
• El código de nuestro index.jsp será:
16
<%@ page contentType="text/xml; charset=UTF-‐8" %><%@ page import="java.io.BufferedReader, java.io.IOException, java.io.InputStreamReader, java.net.MalformedURLException, java.net.URL, java.net.URLConnection" %><%
try { URL twitter = new URL("http://twitter.com/statuses/public_timeline.rss"); URLConnection tc = twitter.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader(tc.getInputStream())); String line; while ((line = in.readLine()) != null) { out.println(line); } in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }%>
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Resultado de la ejecución
17
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Invocación desde una aplicación de escritorio
18
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Estructuras JSON
• JSON es una representación muy utilizada para formatear los recursos solicitados a un servicio web RESTful
• Se trata de ficheros de texto planos que pueden ser manipulados muy fácilmente utilizando Javascript (función eval())• Los elementos están contenidos entre llaves• Los valores de los elementos se organizan en pares con la
estructura “nombre:valor” separados por comas• Las secuencias de elementos están contenidas entre corchetes
• Ejemplo:
19
{ "firstName": "John", "lastName": "Smith", "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021" }, "phoneNumber": [ { "type": "home", "number": "212 555-‐1234"}, { "type": "fax", "number": "646 555-‐4567"} ] }
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Jersey
• Jersey es un framework para implementar servicios JAX-RS• JAX-RS es un API de Java para servicios RESTful, también
se conoce como JAX-311
• Jersey proporciona los conectores para los servicios web a través de anotaciones java• “Decoraremos” las clases con anotaciones específicas para
definir recursos y las acciones que pueden realizarse sobre ellas• Nos olvidamos de las tareas de interceptar peticiones http y
las negociaciones con el framework para centrarnos en la lógica del negocio
20
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Anotaciones Jersey
21
Anotación Descripción@Path Es una URI de un path relativo que indica dónde residirá la clase java
@GET El método java anotado con @GET procesa peticiones HTTP GET
@POST El método java anotado con @POST procesa peticiones HTTP POST
@PUT El método java anotado con @PUT procesa peticiones HTTP PUT
@DELETE El método java anotado con @DELETE procesa peticiones HTTP DELETE
@PathParam Los parámetros del path de la URI se extraen de la URI de la petición, y los nombres de los parámetros se corresponden con los nombres de las variables de las plantillas del path de la URI especificados en la anotación @Path a nivel de clase
@QueryParam Es un tipo de parámetro que puede extraerse para utilizarse en la clase del recurso. Los parámetros de la query de la URI se extraen de los parámetros de query de la URI de la petición
@Consumes Se utiliza para especificar el tipo MIME de las representaciones que un recurso puede consumir cuando ésta es enviada desde el cliente
@Produces Se utiliza para especificar el tipo MIME de las representaciones que un recurso puede proporcionar y enviar al cliente, por ejemplo "text/plain
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Servlet de Jersey• Debemos configurar el servlet de Jersey en web.xml
22
<?xml version="1.0" encoding="UTF-‐8"?><web-‐app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-‐instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-‐app_2_5.xsd"> <servlet> <servlet-‐name>Jersey Web Application</servlet-‐name> <servlet-‐class> com.sun.jersey.spi.container.servlet.ServletContainer </servlet-‐class> <init-‐param> <param-‐name> com.sun.jersey.config.property.packages </param-‐name> <param-‐value>org.especialistajee.rest</param-‐value> </init-‐param> <load-‐on-‐startup>1</load-‐on-‐startup> </servlet> <servlet-‐mapping> <servlet-‐name>Jersey Web Application</servlet-‐name> <url-‐pattern>/recursos/*</url-‐pattern> </servlet-‐mapping></web-‐app>
Paquete que contiene los recursos
URL que da acceso a los recursos
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Implementación de aplicaciones JAX-RS• Los recursos anotados con @Path son recursos raíz• Mapea la URL que da acceso al servicio• Relativa a la URL del servlet de Jersey
• Podemos acceder conhttp://localhost:8080/contexto/recursos/holamundo
23
package org.especialistajee.rest; @Path("/holamundo")public class HolaMundoResource { @GET @Produces("text/plain") public String getSaludo() { return "Hola mundo!"; }}
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Anotación @Path• Identifica la plantilla para la URI del recurso al que se accede
• Se puede especificar a nivel de clase o a nivel de método de dicho recurso• Si se especifica a nivel de método, es relativa a la clase
• Con @PathParam inyectamos segmentos variables del path
24
@Path("/alumnos/{nombre}") public class AlumnoResource { @GET @Produces("text/xml") public String getAlumno( @PathParam("nombre") String nombre) { }}
@Path("/alumnos") public class AlumnoResource { @GET public String getAlumnos() { } @GET @Path("/mensajes") public String getMensajesAlumnos() { }}
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Anotación @Consumes• Esta anotación funciona conjuntamente con @POST y @PUT• Indica a Jersey a qué método se debe delegar la petición HTTP de
entrada• El cliente fija la cabecera HTTP Content-type y el framework delega
la petición al correspondiente método capaz de manejar su contenido
• Si no hay métodos de recurso que puedan responder al tipo MIME solicitado, se le devolverá al cliente un código HTTP 415 ("Unsupported Media Type").
25
@Path("/alumnos") public class AlumnoResource { @PUT @Consumes("application/xml") public void updateAlumno(String representation) { }}
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Anotación @Produces• Esta anotación funciona conjuntamente con @GET, @POST y
@PUT• El cliente envía una petición HTTP junto con una cabecera Accept
HTTP que se mapea directamente con el Content-Type que el método produce
• Si un cliente solicita una petición a una URI con un tipo MIME no soportado por el recurso, se envía de vuelta un error HTTP 406 ("Not acceptable").
26
@Path("/alumnos") public class AlumnoResource { @GET @Produces("application/xml") public String getAlumnosXml() { } @GET @Produces("application/json") public String getAlumnosJson() { }}
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Tipos de datos en la petición y respuesta• Básicos• byte [], char [], String
• Flujos y ficheros• InputStream, File, StreamingOutput
• Datos de formularios• MultivaluedMap<K,V>
• Beans JAXB• Conversión automática entre objetos Java y XML o JSON
• Códigos de estado respuesta• Response (permite añadir contenido y cabeceras)
• Excepciones• WebApplicationException (permite incluir estado de respuesta)
27
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Beans JAXB• La conversión se especifica mediante anotaciones
28
@XmlRootElement(name="estado")public class EstadoBean { @XmlAttribute(name="valor") public String estado = "Idle"; @XmlElement(name="toner") public int tonerRestante = 25; @XmlTransient public int tonerTotal = 100;
@XmlElementWrapper(name="tareas") @XmlElement(name="tarea") public List<TareaBean> tareas = new ArrayList<TareaBean>();}
<estado valor="Idle"> <toner>25</toner> <tareas> <tarea> <nombre>texto.doc</nombre> <estado>imprimiendo...</estado> <paginas>13</paginas> </tarea> <tarea> <nombre>texto2.doc</nombre> <estado>en espera...</estado> <paginas>5</paginas> </tarea> </tareas></estado>
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Código de respuesta• Mediante un objeto de tipo Response• ok devuelve entidad (código 200)• noContent no devuelve contenido (código 204)• created devuelve URI del recurso creado (código 201)
29
@GET@Produces(MediaType.APPLICATION_XML)public Response getAlumnos() { AlumnosBean alumnos = FactoriaDao.getInstance().getAlumnos(); return Response.ok(alumnos).build();} @POST@Consumes(MediaType.APPLICATION_XML)public Response addAlumno(AlumnoBean alumno, @Context UriInfo uriInfo) { String id = FactoriaDao.getInstance().addAlumno(alumno); URI uri = uriInfo.getAbsolutePathBuilder().path("{id}").build(id); return Response.created(uri).build();}
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
Respuesta mediante excepciones• Podemos lanzar WebApplicationException• Permite indicar el código de error que se devolverá
30
@GET@Path("{isbn}")@Produces(MediaType.APPLICATION_XML)public AlumnoBean getAlumno(@PathParam("isbn") String isbn) { AlumnoBean alumno = FactoriaDao.getInstance().getAlumno(isbn); if(alumno==null) { throw new WebApplicationException(Status.NOT_FOUND); } else { return alumno; }}
Experto Universitario Java Enterprise
Componentes web © 2012-2013 Depto. Ciencia de la Computación e IA Servicios Web RESTFul
¿Preguntas...?
31