En Java EE el conjunto de anotaciones para Servicios REST es amplio .Voy a comentar a continuación varias de las mas utilizadas cuando creamos servicios de este tipo dentro del mundo de los standares de Java.
@FormParam :Esta anotación es una anotación a nivel de parámetro y sirve para ligar parámetros de un formulario HTML con variables del servicio REST .
@PathParam: Esta anotación es una anotación a nivel de parámetro y sirve para ligar parámetros de una petición clasica REST con las variables del servicio como por ejemplo /persona/nombre/pedro. En donde la variable nombre tiene asignado el valor de pedro.
@QueryParam: Esta anotación es una anotación útil ya que nos permite leer parámetros que vengan a traves de una petición clásica GET como por ejemplo http://url?nombre=pedro
A continuación podemos ver un servicio REST similar a los anteriores que se apoya en este tipo de anotaciones para clarificar el código .En el se han usado anotaciones @POST para substituir @PUT y @DELETE y se han añadido las anotaciones comentadas antes.
Path("/servicioPersonasAnotaciones/") @Produces("application/json") public class ServicioPersonasAnotaciones { private static List<Persona> listaPersonas = new ArrayList<Persona>(); public ServicioPersonasAnotaciones() { super(); Persona yo = new Persona("pedro", "perez"); listaPersonas.add(yo); } @GET @Path("/personas") public List<Persona> getPersonas() { return listaPersonas; } @POST @Path("/persona/add") public void addPersona(@FormParam("nombre") String nombre, @FormParam("apellidos") String apellidos) { Persona p = new Persona(nombre, apellidos); listaPersonas.add(p); } @GET @Path("/persona/nombre/{nombre}") public Persona buscarPersona(@PathParam("nombre") String nombre) { Persona persona = null; for (Persona p : listaPersonas) if (nombre.equals(p.getNombre())) { persona = p; } return persona; } @GET @Path("/persona") public Persona buscarPersonaClasico(@QueryParam("nombre")String nombre) { Persona persona = null; for (Persona p : listaPersonas) if (nombre.equals(p.getNombre())) { persona = p; } return persona; } @POST @Path("/persona/delete") public void borrarPersona(@FormParam("nombre") String nombre) { Persona p = new Persona(); p.setNombre(nombre); listaPersonas.remove(p); } @POST @Path("/persona/replace/") public void reemplazar(@FormParam("nombre") String nombre, @FormParam("apellidos") String apellidos) { Persona persona = new Persona(nombre, apellidos); listaPersonas.remove(persona); listaPersonas.add(persona); } }
Para clarificar un poco el contenido del código vamos a revisar el método buscarPersona .El cual será ejecutado cuando la petición sea similar a la siguiente.
/persona/nombre/pedro
El código de nuestro método se muestra a continuación:
@GET @Path("/persona/nombre/{nombre}") public Persona buscarPersona(@PathParam("nombre") String nombre) { Persona persona = null; for (Persona p : listaPersonas) if (nombre.equals(p.getNombre())) { persona = p; } return persona; }
La anotación @PathParam que precede al parámetro “nombre” del método será la encargada de mapear el valor “pedro” a la variable nombre
@PathParam("nombre") String nombre
.De esta forma todo será mucho mas sencillo . El resto de anotaciones realiza asignaciones similares pero apoyandose en los parámetros enviados por POST o por QueryString.
Hola, estoy tratando de hacer un microservicio JPA con la anotacion @Get, donde necesito enviarle un dato del headers y otro dato del body pero tengo duda de como recupero estos datos.
Ojala puedan ayudarme
Deberias usar un ResponseEntity como retorno
Buenas tardes. tengo una url con tres parametros pero deben ser opcionales, pero no lo logro si hay alguien que tenga idea como conseguirlo.
deseo listar libros ya sea por id genero o autor o año .
@GET
@Path(“/filtrolibros/{idgenero}?/{idautor}?/{anio}?”)
@Produces(MediaType.APPLICATION_JSON)
public List listlibrosFiltro(@QueryParam(“idgenero”) Integer idgenero,
@QueryParam(“idautor”) Integer idautor,
@QueryParam(“anio”) Integer anio) {
return filtrolibroLogica.listlibrosFiltro(idgenero, idautor, anio);
}
Cambia el Path a:
@Path(“/filtrolibros/”)
..
Antes del return mira si son nulas ..
if (idgenero==null) idgenero = 0 …
if (idautor==null) …
if …
return..
Buenas tardes Cecilio, en mi caso tenia un problema en las anotaciones @RequestMapping(“/”) y
@Scope(“session”).
Necesitaba que el metódo fuera GET y recibiera parametros, pero cuando lo hacia con esas anotaciones no levantaba el servicio.
De esta manera pude tener el método GET y recibir parametros que vienen en la url.
@GET
@Path(“/persona/nombre/{nombre}”)
public Persona buscarPersona(@PathParam(“nombre”) String nombre) {
Muchas gracias amigo.
Como hacer la actualización en una base de datos con el codigo de arribar desde otra aplicacion
con una instrucción put
No conocía los RestControllers, recién estoy empezando con Spring, averiguaré acerca de ellos.
Saludos!
Gracias por la respuesta Cecilio, ya lo resolví usando Gson. El tema era que no encontraba la forma de enviar un objeto para insertarlo en una base de datos, no conseguí pasarle a un método REST un JsonObject como parámetro (estuve cerca, en compilación llegué a no tener errores, pero en ejecución no me dejaba usar JsonObject porque es una interface, seguramente haya alguna forma de resolverlo, pero yo no di con ella). La solución fue colocar el objeto (pares clave-valor) en un String con Gson (en el cliente Android), y de esa manera los capturé en el lado server… Read more »
Hola Alejo, al fin como resolviste aquello, utilzaste alguna libreria desde java? si te refieres a Android, usaste Volley, veras yo tengo un web services que no es mio, es de moodle, el cual recibe un parametro de tipo Rest pero la cuestion es que no se como enviar ese parametro desde android ya que asi mismo como tu dices, tengo un jsonObject, y no se que hacer, te agradeceria de ante mano 🙂
* “capturarlos del lado servidor” quise decir :D.
Hola, muy buena la información.
Tengo una consulta: estoy desarrollando un ejercicio de Web Service REST, con Android del lado cliente y Spring con CXF del lado servidor.
La cuestión es que tengo que enviar datos desde Android a través de JSONObject, pero no encuentro la forma de capturarlos en el método del lado del cliente.
Lo más cerca que estuve de lograrlo fue usando ‘JsrJsonpProvider’, pero el Tomcat no me permite usarlo con JDBC.
Bueno, la cuestión es cómo manejar objetos JSON como parámetro desde un método en Spring, cualquier idea es bienvenida.
Saludos!
En Spring suele ser muy sencillo porque dispone de RestControllers a partir de Spring MVC 4. Es prácticamente utilizar la anotación y hecho. A ver si escribo algo sobre este tema ,gracias por el aporte
Andres,
te aseguraste de definir en el request el tipo de mensaje como application/json?
Hola, estoy usando para hacer un servicio REST la anotación @POST y con @Consumes(“application/json”) pero me devuelve siempre HTTP 405.
Mi código
@POST
@Path(“/insert”)
@Consumes(“application/json”)
// @Produces(“application/json”)
public Response createCliente();