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 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);
};

results matching ""

    No results matching ""