Está en la página 1de 4

Servicios Web

REST
La arquitectura Representational State Transfer, REST, pone los servicios web a disposicin de los
clientes, como recursos HTTP accesibles mediante una URI o hyperlink.
Un recurso puede ser una lista de libros, la informacin de una persona, una foto, Las URI describiendo
un recurso deben ser lo ms descriptivas posible de tal manera que de forma intuitiva se pueda
interpretar el posible resultado de la accin:
http://server/catalogo/libros/2009 Debera devolver todos los libros publicados en el 2009
http://server/peliculas?id=5 Debera devolver aquella pelcula con el identificador nmero 5

Los recursos pueden adems obtenerse en diversos formatos: texto, xml, cvs, json,
Esto implica que el cliente lo que obtiene es la representacin de un recurso en su estado actual, y que
un recurso pude ser representado de distintas maneras o formatos.
Ejemplo. (Google Maps Directions)
http://maps.googleapis.com/maps/api/directions/xml?origin=%20Universidad%20Tecnologica%
20Equinoccial,%20Bourgeois,%20Quito%20&destination=%20Universidad%20Tecnol%C3%B3gic
a%20Equinoccial%20Campus%20Occidental,%20Quito&sensor=false
Para acceder y manipular los recursos se utiliza el protocolo HTTP y sus diferentes mtodos,
especialmente: GET, POST, PUT y DELETE. La implementacin de cmo debern comportarse estos
mtodos depende del programador de la aplicacin. Sin embargo, para normar el comportamiento de las
aplicaciones se siguen las siguientes convenciones:
GET: recupera un recurso sin modificar ninguna informacin en el entorno.
POST: crea un nuevo recurso, por ejemplo un nuevo libro, etc., sin modificar ningn otro recurso
existente.
PUT: modifica un recurso existente, sin embargo si el recurso no existe ser creado. Ninguna otra
modificacin debe ocurrir.
DELETE: elimina un recurso existente, igualmente sin modificar nada ms en el entorno.
Los servicios REST, al trabajar tan estrechamente ligados con los mtodos HTTP, deben cargarse en el
contexto de una aplicacin web.
New Project / Java Web / Web Application

La aplicacin web se podr acceder con el path http://server/appname/ de manera que si el servidor
corre en localhost, y la aplicacin web creada se llama HolaRest, el path de base ser
http:/localhost/HolaRest/

Dentro de esta aplicacin web debemos crear el servicio REST.


Configuracin de la aplicacin.
Para definir el path de acceso general al servicio REST, debemos utilizar la anotacin
@ApplicationPath("rest"), donde rest es el path para acceder a los recursos del servicio. Cualquier
acceso a la funcionalidad proporcionada por este servicio REST deber hacerse con el path
http:/localhost/HolaRest/ rest/

La anotacin @ApplicationPath, sin embargo, solo puede usarse en una clase que extienda de
Application, de manera que se recomienda crear una clase exclusivamente para este efecto:
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("rest")
public class MiSrvPath extends Application {
}

Servicio
El servicio est constituido por todas las clases conteniendo la implementacin de los mtodos ofrecidos
por el servicio, la anotacin ms relevante es @Path("srv"), la cual le da la calidad de servicio. El
parmetro srv indica el path de base que se utilizar para acceder a la funcionalidad de esta
implementacin en el servicio: http:/localhost/HolaRest/rest/srv
Dentro de la clase se especifican los mtodos que manejarn los distintos tipos de peticiones.
Dependiendo de la peticin estos mtodos utilizarn las anotaciones @GET, @POST, @PUT, @DELETE.
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path("srv")
public class Simple {
@GET
public String bienvenida() {
return "Hola";
}
}

En el ejemplo el mtodo bienvenida es invocado cuando se hace una llamada con el path completo del
servicio (http:/localhost/HolaRest/ rest/srv), utilizando el mtodo GET. El resultado devuelto por
el mtodo es el texto: Hola
Adicionalmente, dependiendo de si el mtodo devuelve o recibe valores, se usarn las anotaciones
@Produces, para indicar el tipo de dato a devolverse o el formato de la representacin del recurso, y

@Consumes, para indicar el tipo de dato a recibirse como parmetro. Para indicar el tipo de dato
especfico se deber utilizar el formato MIME: tipo/subtipo

@Path("srv")
public class Simple {
@GET
@Produces("text/plain")
public String bienvenida() {
return "Hola";
}
@PUT
@Consumes("text/plain")
public void putText(String content) {
}
}

Para probar nuestro ejemplo podemos ir directamente al browser y poner la direccin


http:/localhost/HolaRest/rest/srv

Ejecutndose bienvenida, ya que usamos el mtodo GET. Veremos en la pantalla del browser el texto
Hola
Si bien el mtodo PUT no hace nada por lo pronto, podemos probarlo usando curl
(http://curl.haxx.se/download.html)
curl -v -H "Content-Type: text/plain" -X PUT -d "algo"
http:/localhost/HolaRest/rest/srv

Veremos en la pantalla el mensaje HTTP de respuesta 204 el cual indica que el recurso se encontr, pero
que no hay respuesta o dicho de otra manera, que la respuesta no tiene contenido. Un mtodo PUT, sin
embargo, podra ser capaz de devolver informacin, por ejemplo sobre el elemento modificado. Vamos
a revisar esto en el siguiente ejemplo, donde adems veremos de qu manera se pueden pasar valores a
un servicio utilizando parmetros. Consideremos la siguiente versin de putText:
@PUT
@Path("{uno}/{dos}")
@Produces("text/plain")
public String putText(@PathParam("dos") String a, @PathParam("uno") int i) {
return a + "|" + i;
}

La anotacin @Path("{uno}/{dos}")indica que se requieren dos parmetros, uno y dos. La


anotacin @Produces("text/plain")indica que el mtodo devolver texto simple, lo cual debe
contrastar con el tipo de dato devuelto por el mtodo, en este caso String. Finalmente los parmetros
se reciben en variables, gracias a las anotaciones @PathParam. @PathParam("dos") String a nos
indica que el valor del parmetro dos debe ser una cadena de texto, y se recibir en la variable a.
@PathParam("uno") int i indica que el valor del parmetro uno debe ser un entero y se recibir en

la variable i. Ntese que el orden de los parmetros en la anotacin @Path no influye en el orden de
los parmetros en el mtodo. Es el nombre en @PathParam el que define el mapeo.
Si lo ejecutamos utilizando curl:
curl -v -H "Content-Type: text/plain" -X PUT
http:/localhost/HolaRest/rest/srv/10/hola

veremos el resultado:
< HTTP/1.1 200 OK
< X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2
Java/Oracle Corporation/1.7)
* Server GlassFish Server Open Source Edition 3.1.2 is not blacklisted
< Server: GlassFish Server Open Source Edition 3.1.2
< Content-Type: text/plain
< Transfer-Encoding: chunked
< Date: Tue, 18 Jun 2013 21:20:32 GMT
<
hola|10