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.







