GET /books/{id}
GET /books
Retorna un objeto Book en representación full. Cada libro en la colección tiene embebida su editorial y el conjunto de sus reviews.
Parámetros
Nombre | Ubicación | Descripción | Requerido | Esquema |
---|---|---|---|---|
id | Path | ID del objeto book a consultar | Sí | Integer |
Respuesta
Código | Descripción | Cuerpo |
---|---|---|
200 | OK | Objeto book en representaciones Full |
404 | No existe un objeto book con el ID solicitado | Mensaje de error |
500 | Error interno | Mensaje de error |
Implementación del servicio rest
Para implementar el servicio GET /books/{id}
Una vez el front envía la petición, el servlet de JAX-RS la recibe. Basándose en la URL solicitada (api/books/{id}
) y en el método HTTP (GET
), JAX-RS busca una clase con la anotación @Path('books')
y que tenga un método con la anotación @GET
y @Path("{id}")
, el cual será ejecutado para responder a la solicitud.
@Path("books")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class BookResource {
@Inject
private IBookLogic bookLogic;
// ...
@GET
@Path("{id: \\d+}") // Los dos puntos permiten definir una expresión regular para el parámetro. En este caso solo acepta números.
public BookDTO getBook(@PathParam("id") Long id) {
// implementacion
}
//...
}
El método getBook() retorna una lista de instancias de BookDTO.
Invocación de API de lógica
Inmediatamente se recibe la petición, el servicio de JAX-RS invoca a la capa lógica. Para esto, se inyectó una instancia de IBookLogic
, cuya inicialización es resuelta por el contenedor. La capa de lógica retorna un objeto BookEntity que debe ser convertido a BookDTO.
@Path("books")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class BookResource {
@Inject
private IBookLogic bookLogic; // Inyección del bean de lógica
// ...
@GET
@Path("{id: \\d+}")
public BookDTO getBook(@PathParam("id") Long id) {
logger.log(Level.INFO, "Se ejecuta método getBook con id={0}", id);
try {
BookEntity book = bookLogic.getBook(id);
return BookConverter.fullEntity2DTO(book);
} catch (BusinessLogicException ex) {
logger.log(Level.SEVERE, "El libro no existe", ex);
throw new WebApplicationException(ex.getLocalizedMessage(), ex, Response.Status.NOT_FOUND);
}
}
//...
}
Cuando el servicio recibe la respuesta, necesita serializarla en formato JSON para poder transmitirla con el protocolo HTTP. Aquí es donde JAX-B entra en acción. Este puede serializar los DTO a JSON, mapeando los atributos del objeto DTO a propiedades del objeto JSON. Así, cada método accesor (getter) es mapeado a una propiedad del JSON. En este caso, book quedaría como un objeto JSON, donde cada propiedad accesible con un get, está disponible como atributo del JSON.
En el front-end, $http
recibe la respuesta y la pone a disposición del promise como argumento. De esta manera el controlador puede usar los datos de la misma para ejecutar tareas de manera asíncrona.
this.editRecord = function (record) {
$scope.$broadcast("pre-edit", $scope.currentRecord);
return svc.fetchRecord(record.id).then(function (response) {
$scope.currentRecord = response.data; // asigna a currentRecord el valor del libro consultado
self.editMode = true; // Activa el modo de edición
$scope.$broadcast("post-edit", $scope.currentRecord); // Anuncia el evento post-edit
return response; // Devuelve la respuesta para el siguiente promise
}, responseError);
};