Back-End

30 mar, 2010

Clientes de serviços Rest com RestEasy

Publicidade

Gerar um Server Rest com a JAX-RS ficou
muito mais fácil, mas gerar um Client de um serviço Rest nem tanto. Poderíamos
utilizar o tradicional HttpClient e o XStream para fazer o parse do
resultado para o objeto. Para facilitar a nossa vida, o RestEasy criou o
Client Framework que nos permite utilizar das anotações do JAX-RS para
chamarmos os métodos do serviço.

Como exemplo, faremos uma chamada GET em http://localhost:8080/test/services/server/name e o retorno da chamada é:

<usuario>
   <nome>Breno Oliveira</nome>
   <site>http://www.brenooliveira.com.br</site>
</usuario>

A vantagem que vejo do RestEasy é que podemos aproveitar as
anotações do JAX-RS e do JAXB para fazer o nosso cliente. Então, basta
criarmos uma interface com as anotações @Path, @GET e @Consumes e criar uma
classe com as anotações do JAXB, no caso usuário.

Vejamos o código da nossa interface:

@Path("services/server")
public interface IClient {   
@GET
    @Path("/name")
    @Consumes(MediaType.APPLICATION_XML)
    Usuario name();
}

Na interface fica a representação dos serviços Rest que você queira consumir, tais como POST, GET, PUT e DELETE. Nela também definimos as URLs e os parâmetros quando necessário.

Como podemos ver, anotamos a interface com
@Path, marcamos como /services/server, que é parte do endereço do serviço. Já no nosso método, anotamos com @GET, que indica que a requisição deve
ser por GET, mas poderíamos anotar com @POST, @DELETE e @PUT, conforme o serviço que você queira consumir. Logo em seguida marcamos novamente com @Path passando o último parâmetro da nossa
URL /name e também indicamos com @Consumes que a resposta será em forma
de XML.

Agora vamos criar uma classe que representa o usuário. 

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Usuario {
    private String nome;
    private String site;
    public Usuario() {}
    public Usuario(final String nome, final String site) {
        this.nome = nome;
        this.site = site;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(final String nome) {
        this.nome = nome;
    }
    public String getSite() {
        return cidade;
    }
    public void setSite(final String site) {
        this.site = site;
    }
    @Override
    public String toString() {
        return "Usuario [site=" + site + ", nome=" + nome + "]";
    }
}

Apenas adicionamos as anotações do JAXB em uma classe chamada
Usuario, assim como o nó principal do nosso XML e adicionamos os dois
elementos da nossa XML.

Então agora vamos para o momento onde o RestEasy faz a mágica:

public class Client {
    static {
        // precisa ser chamo uma única vez para registrar providers RESTEasy, scanear classes, etc
         RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
    }
    public static void main(final String[] args) {
        IClient client = ProxyFactory.create(IClient.class, "http://localhost:8080/test");
        Usuario name = client.name();
        System.out.println(name);
    }
}

Bom, o bloco static é para ser executado
apenas uma única vez, conforme está na documentação do RestEasy. Então
em nosso método main utilizamos o ProxyFactory do RestEasy passando a
nossa interface com a URL, o ProxyFactory.create se encarregará de gerar uma
implementação baseada nas anotações feitas na interface. Então basta chamar os métodos
declarados na Interface o RestEasy, também já faz o parse da resposta
xml para o objeto.

Se tudo ocorreu sem erros, você pode visualizar o toString() do nosso objeto.

Usuario [site=http://www.brenooliveira.com.br, nome=Breno Oliveira]

Podemos concluir que o Client Framework do RestEasy é uma solução mais simples que utilizar o HttpClient. Observo que o RestEasy Client  Framework já utiliza o HttpClient, mas ele cria as implementações para você a partir da interface anotada com JAX-RS. Lembro que o Client Framework não faz parte da JSR, então o ProxyFactory você só encontra nos JARs do RestEasy.

Espero que tenha sido útil a todos e que seja mais uma alternativa para aumentar a produtividade com Java.

Abraços e até a próxima.