sábado, 10 de marzo de 2018

Desarrollo RESTful WebService APIs with JAX-RS Parte 5


HATEOAS


  uriInfo
      .getAbsolutePathBuilder()
      |
      |__  uriBuilder
               .path("algo")                                          /algo/
               .path(AnyResource.class)

               .path(MessageResource.class)              /mensajes/

  uriInfo.getBaseUriBuilder()                      http://localhost:8080/miblog/webapi/
             .path(MessageResource.class)                                                                  /mensajes
             .path(Long.toString(message.getId())                                                                 /{messageId}
             .build();


Se crea una clase Link en model

public class Link {
    private String link;
    private String rel;
       setters y getters...

Se integra el campo a MessageResource

private List<Link> links = new ArrayList<>();

y sus métodos

public List<Link> getLinks() {
    return links;
}

public void setLinks(List<Link> links) {
    this.links = links;
}

public void addLink(String url, String rel) {
    Link link =  new Link();
    link.setLink(url);
    link.setRel(rel);
    links.add(link);
}

y getMessage se prepara para integrar el uri y rel. , regresando links.

@GET@Path("/{messageId}")
public Message getMessage(@PathParam("messageId") long Id, @Context UriInfo uriInfo) {
    Message message = messageService.getMessage(Id);
    message.addLink( getUriForSelf(uriInfo, message),"self");
    return message;
}

private String getUriForSelf(@Context UriInfo uriInfo, Message message) {
    return uriInfo.getBaseUriBuilder()
                .path(MessageResource.class)
                .path(Long.toString(message.getId()))
                .build()
                .toString();
}

El resultado


Procedimiento similar es agregar el perfile a los links.

private String getUriForProfile(UriInfo uriInfo, Message message) {
    return uriInfo.getBaseUriBuilder()
    .path(ProfileResources.class)
    .path(message.getAuthor())
    .build()
    .toString();
}

En el caso de agregar los comentarios, hay que hacer una rebusqueda del path de los recursos, ya que como es un subrecurso el solo comando .path(CommentsResources.class) no es suficiente, ya que solo nos dara "/", así que hay que construir la ruta de /mensaje/{mensajeId}/comentarios/{comentariosId}, para eso Jersey nos ayuda.

@GET@Path("/{messageId}")
public Message getMessage(@PathParam("messageId") long Id, @Context UriInfo uriInfo) {
    Message message = messageService.getMessage(Id);
    message.addLink( getUriForSelf(uriInfo, message),"self");
    message.addLink( getUriForProfile(uriInfo, message), "profile");
    message.addLink( getUriForComment(uriInfo, message), "comments");
    return message;
}

private String getUriForComment(UriInfo uriInfo, Message message) {
    return uriInfo.getBaseUriBuilder()
            .path(MessageResource.class)
            .path(MessageResource.class,"getCommentResource")
            .path(CommentResource.class)
            .resolveTemplate("messageId", message.getId())
            .build()
            .toString();
}

private String getUriForProfile(UriInfo uriInfo, Message message) {
    return uriInfo.getBaseUriBuilder()
    .path(ProfileResources.class)
    .path(message.getAuthor())
    .build()
    .toString();
}

En el subrecurso, tenemos en el path messageId, el cual hay que obtener, para ello se usa revolveTemplate(...)

@Path("/{messageId}/comentarios")
public CommentResource getCommentResource() {
    return new CommentResource();
}

Y tenemos el resultado


Jersey tiene una class Link que se puede usar como alternativa.

fin texto.

No hay comentarios:

Publicar un comentario