martes, 24 de marzo de 2009

REST Web Services con Jersey (III)

Los métodos de un recurso, pueden representar un sub-recurso si también se anotan con @Path

La URI especificada, es relativa a la ruta del recurso (especificada en la clase). Por ejemplo, la URI http://example.com/cantantes/ retornaría la lista de cantantes y la URI http://example.com/cantantes/13 retornaría la información relativa al cantante 13.

Se puede recuperar la información introducida con la anotación @PathParam

@Path("/holaMundo")
public class HolaMundo {
@GET
@Path("{id}")
@Produces("application/xml")
public String sayHolaXml(@PathParam("id") int id) {
return ""+id+"";
}
}

Al especificar que el tipo es int, si la URI fuera /holaMundo/ABC, automáticamente se retornaria un HTTP 404.
La ruta especificada en @Path puede incluir expresiones para controlar los valores admitidos. En el siguiente ejemplo, únicamente se admiten números hasta 3 dígitos:

@Path("{id: [0-9]{1,3}}")


La anotación @QueryParam permite inyectar un parámetro de query String. Por defecto, los recursos se instancian para cada petición para evitar problemas de concurrencia y se pueden anotar argumentos de un método y variables de clase u objeto.

La anotación @DefaultValue asigna un valor por defecto a variables inyectadas con @PathParam o @QueryParam entre otras (@MatrixParam, @CookieParam, @FormParam, @HeaderParam)


@Path("/holaMundo")
public class HolaMundo {
@GET
public String sayHola(@QueryParam("p") @DefaultValue("sin valor") String p) {
return p;
}
}


Si ejecutamos el siguiente cliente:

Client client = Client.create();
WebResource holaResource = client.resource("http://localhost:8080/RestTest/resources/holaMundo/");

out.println(holaResource.get(String.class));
out.println(holaResource.queryParam("p", "Hola :)").get(String.class));


Nos dará como salida:
sin valor
Hola :)

Los parámetros POST se pueden inyectar con @FormParam

@Path("/holaMundoPost")
public class HolaMundoPost {
@POST
@Consumes("application/x-www-form-urlencoded")
public String sayHola(@FormParam("p") @DefaultValue("sin valor") String p) {
return p;
}
}


La anotación @Consumes permite especificar el tipo MIME que acepta el método. Si no se especifica se acepta cualquiera.

El cliente quedaría de la siguiente forma:

Client client = Client.create();
WebResource postResource = client.resource(
"http://localhost:8080/RestTest/resources/holaMundoPost/");
out.println(postResource.post(String.class));
MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("p", "Hola Post:)");
out.println(postResource
.type("application/x-www-form-urlencoded")
.post(String.class, formData));

1 comentario:

JR dijo...

Me preguntaba como hacer esto...
@Path("/holaMundo")
public class HolaMundo {
@GET
@Path("{id}")
@Produces("application/xml")
public String sayHolaXml(@PathParam("id") MyObjeto id) {
return ""+id+"";
}
}
Donde el parametro de entrada @PathParam sea un objeto propio.

Saludos y gracias