Professional Documents
Culture Documents
REST:
Introducción
Jersey JAX-RS
Acceso a servicios REST
Testing en Jersey
Cliente rico:
Tipos de frameworks
ExtJS
Integración ExtJS / REST
Introducción
Principales objetivos:
Arquitectura flexible e interoperable:
Modelo de negocio siempre accesible a
distintos frameworks en distintos
dispositivos
Facilidad de integración con otras
aplicaciones
Mejora de la experiencia de usuario
Introducción
¿Qué es REST?
Introducción
Una URI define la identidad de un recurso en la web
Tanto las URL como los URN son URIs
Un URN sólo define un nombre, pero no ninguna
forma de recuperar ese recurso
(urn:isbn:0451450523)
Una URL define como recuperar ese recurso a través
de la web (http://www.a.com/doc.pdf)
Introducción
Petición HTTP:
Respuesta HTTP:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html
Connection: Keep-Alive
Keep-Alive: timeout=30, max=999
Server: Oracle-Application-Server-10g/10.1.2.3.0 Oracle-HTTP-Server OracleAS-
Web-Cache-10g/10.1.2.3.0 (H;max-age=3600+360;age=350;ecid=759620335360,0)
Content-Length: 25671
Date: Thu, 14 Oct 2010 17:05:03 GMT
Introducción
REST aprovecha realmente la arquitectura
diseñada para la WWW
Los navegadores sólo aprovechan una parte de
la semántica disponible
Introducción
POST. Creación de un nuevo recurso
No es seguro y no es idempotente
GET. Recuperación de un recurso
Sí es seguro y sí es idempotente
PUT. Modificación de un recurso o creación de un
recurso del que conocemos el ID
No es seguro y sí que es idempotente
DELETE. Borra un recurso
No es seguro y sí que es idempotente
Introducción
Ejemplos:
GET /cars: Lista todos los coches
GET /cars/1234AAW: Recupera un coche
POST /cars: Añade un nuevo coche
PUT /cars/1234AAW: Crea o modifica un
coche
PUT /cars/1234AAW: Crea un nuevo coche.
DELETE /cars/1234AAW: Elimina un coche
Introducción
Wikipedia:
”Web services are typically application
programming interfaces (API) or Web APIs that
are accessed via Hypertext Transfer Protocol
(HTTP) and executed on a remote system
hosting the requested services. Web services
tend to fall into one of two camps: SOAP Web
services or RESTful Web services.”
Introducción
La clave es HATEOAS:
Hypermedia as the Engine of Application State
Diferencia a REST de un RPC convencional y
representa un avance:
”Las respuestas del servidor contienen links
que corresponden a las acciones que se
pueden realizar, en función del estado actual
de la aplicación”
Introducción
'home': {
'href':'/store/home'
}, 'search': {
'description':'search books',
'href':'/store/books{?title,author,minPrice,maxPrice}'
}, 'byId': {
'href':'/store/books/{bookId}'
}
Índice
REST:
Introducción
Jersey JAX-RS
Acceso a servicios REST
Testing en Jersey
Cliente rico:
Tipos de frameworks
ExtJS
Integración ExtJS / REST
Jersey JAX-RS
Jersey es la implementación Java de referencia
del estándar JAX-RS para la definición de
servicios REST:
https://jersey.dev.java.net/
Se aplica sobre POJOs
Define un conjunto de anotaciones, de
proveedores y de filtros para gestionar el ciclo
de vida de las peticiones/respuestas HTTP
Jersey JAX-RS
@Path("coches")
public class CochesService {
@GET
public List<Coche> getCoches() {
}
}
Jersey JAX-RS
@GET
@Path("/coches/{matricula}")
public Coche getCoche(
@PathParam("matricula") String matricula,
@QueryParam("puertas") @DefaultValue("5")
String puertas) {
}
Jersey JAX-RS
@GET
@Produces(MediaType.APPLICATION_XML)
public List<Coche> getCoches() {
}
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public void updateCoche(Coche coche) {
}
Jersey JAX-RS
Petición HTTP:
@GET @Path @QueryParam
GET /recurso/base?param=valor HTTP/1.1
Host: www.uji.es @PathParam
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; es-CL; rv:1.9.2.10) Gecko/20100922
Ubuntu/10.10 (maverick) Firefox/3.6.10
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-cl,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate @Produce
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Jersey JAX-RS
Respuesta HTTP:
Response
HTTP/1.1 200 OK
@Produce
Content-Type: text/html
Server: Oracle-Application-Server-10g/10.1.2.3.0
Content-Length: 25671
Date: Thu, 14 Oct 2010 17:05:03 GMT
Configuración de la webapp:
<web-app>
<servlet>
<servlet-name>rest</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>com.decharlas.usuarios.services</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Índice
REST:
Introducción
Jersey JAX-RS
Acceso a servicios REST
Testing en Jersey
Cliente rico:
Tipos de frameworks
ExtJS
Integración ExtJS / REST
Acceso a servicios REST
Curl:
POST:
curl -i -H "Accept: application/json" -X POST -d "user=pepe"
http://localhost/persons/person
PUT:
curl -i -H "Accept: application/json" -X PUT -d
"phone=964556677" http://localhost/persons/person/1
GET:
curl -i -H "Accept: application/json"
http://localhost/persons?zipcode=93031
DELETE:
curl -i -H "Accept: application/json" -X DELETE
http://localhost/persons/person/1
Acceso a servicios REST
Comprobación del resultado:
if (response.getStatus() == Status.OK.getStatusCode()) {
...
}
Índice
REST:
Introducción
Jersey JAX-RS
Acceso a servicios
Testing en Jersey
Cliente rico:
Tipos de frameworks
ExtJS
Integración ExtJS / REST
Testing en Jersey
Requisitos:
Entorno de integración contínua
API testeable
Independencia respecto al despliege de
la aplicación
Testing en Jersey
@Override
protected TestContainerFactory getTestContainerFactory()
{
return new EmbeddedGlassFishTestContainerFactory();
}
@Test
public void testHelloWorld()
{
WebResource webResource = resource();
String result = webResource.path("rest/helloworld").
accept(MediaType.TEXT_PLAIN).get(String.class);
Assert.assertEquals("Hello World", result);
}
}
Índice
REST:
Introducción
Jersey JAX-RS
Acceso a servicios
Testing en Jersey
Cliente rico:
Tipos de frameworks
ExtJS
Integración ExtJS / REST
Tipos de frameworks
REST:
Introducción
Jersey JAX-RS
Acceso a servicios
Testing en Jersey
Cliente rico:
Tipos de frameworks
ExtJS
Integración ExtJS / REST
ExtJS
REST:
Introducción
Jersey JAX-RS
Acceso a servicios
Testing en Jersey
Cliente rico:
Tipos de frameworks
ExtJS
Integración ExtJS / REST
Integración ExtJS / REST
Elementos principales:
De estructura:
Viewport y Panel:
http://dev.sencha.com/deploy/dev/docs/index.html
Layouts:
http://dev.sencha.com/deploy/dev/examples/#sample-9
De datos:
Store
Reader/Writer (XML/JSON)
Comunicación AJAX
Integración ExtJS / REST
Elementos principales:
Widgets:
GridPanel:
http://dev.sencha.com/deploy/dev/examples/#sample-4
FormPanel y componentes de formulario:
http://dev.sencha.com/deploy/dev/examples/#sample-11
TreePanel:
http://dev.sencha.com/deploy/dev/examples/#sample-8
Windows:
http://dev.sencha.com/deploy/dev/examples/#sample-7
Integración ExtJS / REST
Con la inclusión implícita usando JSON y el
atributo ”xtype”:
{
xtype : 'form',
items: [{
xtype : 'textfield',
name : "nombre",
fieldLabel : 'Nombre'
}]
}
Integración ExtJS / REST
<script type="text/javascript">
Ext.onReady(function() {
Ext.Msg.alert("Información", "Alerta desde ExtJS");
});
</script>
</head>
<body></body>
</html>
Integración ExtJS / REST
GridPanel:
var grid = new Ext.grid.GridPanel( {
store : store,
sm : new Ext.grid.RowSelectionModel( { singleSelect : true }),
frame : true,
colModel : new Ext.grid.ColumnModel( {
defaults : {
sortable : true
},
columns : [ {
header : 'Código',
dataIndex : 'id',
width : 10,
editor: {
xtype: 'textfield',
allowBlank: false
}
}, … ]
}),
listeners : {
rowclick : function(grid, rowIndex, evt) {
…
}
}
});
Integración ExtJS / REST
FormPanel:
new Ext.FormPanel( {
title : 'Users',
frame : true,
url: '/usuarios/rest/users',
items : [ {
xtype : 'textfield',
name : "id",
fieldLabel : 'Código',
allowBlank: false
}, … ],
buttons: [ {
xtype : 'button',
text : 'Añadir',
handler : function() {
if (form.getForm().isValid()) {
form.getForm().submit({
success: function(form, action) {},
failure: function(form, action) {}
});
}
}
}]
});
Fin
¿Preguntas?