Dev (Back & Front)ARTIGO

Clientes de serviços Rest com RestEasy

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><br />   <nome>Breno Oliveira</nome><br />   <site>http://www.brenooliveira.com.br</site><br /></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")<br />public interface IClient {    <br />    @GET<br />    @Path("/name")<br />    @Consumes(MediaType.APPLICATION_XML)<br />    Usuario name();<br />}

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<br />@XmlAccessorType(XmlAccessType.FIELD)<br />public class Usuario {<br />    private String nome;<br />    private String site;<br />    public Usuario() {}<br />    public Usuario(final String nome, final String site) {<br />        this.nome = nome;<br />        this.site = site;<br />    }<br />    public String getNome() {<br />        return nome;<br />    }<br />    public void setNome(final String nome) {<br />        this.nome = nome;<br />    }<br />    public String getSite() {<br />        return cidade;<br />    }<br />    public void setSite(final String site) {<br />        this.site = site;<br />    }<br />    @Override<br />    public String toString() {<br />        return "Usuario [site=" + site + ", nome=" + nome + "]";<br />    }<br />}

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

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.

É programador viciado, pós-graduado pela Universidade de São Paulo, e tem trabalhado com desenvolvimento de software há mais de quatorze anos, começando com tecnologias como PHP para Web e migrando para linguagens como Ruby, Java, JavaScript and Go. Atualmente focado no desenvolvimento mobile para Android e iOS, incluindo wearables como smartwatches. Também tem uma grande experiência acumulada com Arquitetura de Software, Micro Services, DevOps, DDD, TDD, BDD e é um entusiasta com metodologias ágeis como Scrum, XP, Lean e Kanban. Atualmente, tem estudado mais movimento de Fintechs, acumulando grande experiência na MoIP e um grande entusiasmado com a criação de ferramentas para recrutamento e seleção.

Ver perfil