WebService REST fácil com Groovy e Jersey
Como já disse o Jim Webber o WSDL deve morrer! Não tenho dúvidas de que em termos de produtividade e simplicidade utilizar WS-REST é a melhor solução do que utilizar WS-*. Em 2007 já tinham surgido soluções em Java para implementação de WS-REST como o RESTLet. Hoje após a criação da JSR-311, que dita como criar um WebService REST em Java existem já alguns frameworks que podemos utilizar além do RESTLet como o Jersey.
O Jersey é um framework Java que implementa a JSR-311 além de ser a implementação de referência para essa JSR. Com ele podemos escrever WebServices REST de maneira fácil e rápida utilizando um conjunto de anotações.
Você pode publicar um WS-REST utilizando qualquer container como o Glassfish, JBoss, Oracle IAS, ou até mesmo o Tomcat. Mas existe um pequeno servidor chamado de Grizzly. Esse servidor é escrito em Java e prove acesso via HTTP e de forma parcial a API de servlets, mas isso é mais do que suficiente para a escrite e disponibilização de um WS-REST.
Vou mostrar como é fácil fazer um WebService REST utilizando Groovy, Grizzly e Jersey. O código é muito simples e resumo você expoe um POJO Groovy anotado com as anotações do Jesery através do Grizzly, ai basta consumilo com um client. Esse client pode ser um script Groovy, o seu browser ou quaçquer linguagen como Delphi, PHP, .NET, etc...
GroovyPojo.groovy
Esse é o POJO que será exposto via Grizly. Reparem que ele possui as anotações do Jersey. Vou explicar anotação por anotação.
GroovyRESTServer.groovy
Você deve deixar essa classe rodando para que o server fique no ar. Como você pode ver ele é muito simples, como estou utilizando Groovy as coisas ficam mais simples ainda.
A primeira coisa foi costruir um adpter via ContainerFactory.createContainer, aqui eu digo qual adpter eu vou utilizar e qual POJO eu quero expor. Depois eu monto a URL que o WS-REST vai responder com o UriBuilder. Finalmente o WS-RESt é criado no Grizzly com o GrizzlyServerFactory.
Agora vamos ao código cliente. Após subir o server a qualquer momento você pode digitar no Browser:
GroovyRESTClient.groovy
Através do Client.create() acessei o WS-RESt feito em Groovy e depois para usar os métodos publicados foi utilizado o .path() para dar o path e por fim disse como eu queria pegar o retorno, nesses casos tudo é String.
Se Alguem quizer o código está disponível aqui. Utilizei o plugin do Groovy para o eclipse, se tiverem problemas com plugin do Groovy na versão 3.4.1 do eclipse verifiquem isso.
O Jersey é um framework Java que implementa a JSR-311 além de ser a implementação de referência para essa JSR. Com ele podemos escrever WebServices REST de maneira fácil e rápida utilizando um conjunto de anotações.
Você pode publicar um WS-REST utilizando qualquer container como o Glassfish, JBoss, Oracle IAS, ou até mesmo o Tomcat. Mas existe um pequeno servidor chamado de Grizzly. Esse servidor é escrito em Java e prove acesso via HTTP e de forma parcial a API de servlets, mas isso é mais do que suficiente para a escrite e disponibilização de um WS-REST.
Vou mostrar como é fácil fazer um WebService REST utilizando Groovy, Grizzly e Jersey. O código é muito simples e resumo você expoe um POJO Groovy anotado com as anotações do Jesery através do Grizzly, ai basta consumilo com um client. Esse client pode ser um script Groovy, o seu browser ou quaçquer linguagen como Delphi, PHP, .NET, etc...
GroovyPojo.groovy
package com.blogspot.diegopacheco.groovy.rest.server import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; /** * * POJO Groovy que utiliza as anotaçoes do Jersey. * * @autor Diego Pacheco * @since 05/01/2009 * @version 1.0 * **/ @Path("groovy-pojo") class GroovyPojo { @GET @Produces(["text/html"]) def show() { "groovy WS-REST Rocks!" } @GET @Produces(["text/html"]) @Path("/diego") def showPath() { "http://diego-pacheco.blogspot.com" } }
Esse é o POJO que será exposto via Grizly. Reparem que ele possui as anotações do Jersey. Vou explicar anotação por anotação.
- @GET: Aqui estou dizendo que quando esse recurso for invocado pelo método GET do HTTP o método que possui essa anotação será executado. Você pode usar outras anotações, no caso o Jersey concencionou que as anotações tem o mesmo nome do método no protocolo HTTP. EX: @PUT, @POST, etc...
- @Produces(["text/html"]) : Aqui estou dizendo que o método que possuir essa anotação gerá como saida HTML poderia ser texto puro mesmo, XML ou outra saida.
- @Path("/diego"): Por fim essa anotação indica que mesmo o resucros sendo exposto deverá ser acessível ainda pelo caminho /diego. Semelhante a uma página dentro de um context root.
GroovyRESTServer.groovy
package com.blogspot.diegopacheco.groovy.rest.server import com.sun.grizzly.http.SelectorThread; import com.sun.grizzly.tcp.Adapter; import com.sun.jersey.api.container.ContainerFactory; import com.sun.jersey.api.container.grizzly.GrizzlyServerFactory; import com.blogspot.diegopacheco.groovy.rest.server.GroovyPojo; import javax.ws.rs.core.UriBuilder; import java.io.IOException; import java.net.URI; import java.util.HashMap; import java.util.Map; /** * * Server Groovy que utiliza o Grizzly para levantar um endpoint WS-REST * feito em Groovy. * * @autor Diego Pacheco * @since 05/01/2009 * @version 1.0 * **/ adapter = ContainerFactory.createContainer(Adapter.class,GroovyPojo.class) baseUri = UriBuilder.fromUri("http://localhost/").port(10101).build() server = GrizzlyServerFactory.create(baseUri, adapter) System.out.println("Jersey WS-REST startado... OK"); System.out.println("Tente digitar: http://127.0.0.1:10101/groovy-pojo no seu browser") System.in.read() server.stopEndpoint()
Você deve deixar essa classe rodando para que o server fique no ar. Como você pode ver ele é muito simples, como estou utilizando Groovy as coisas ficam mais simples ainda.
A primeira coisa foi costruir um adpter via ContainerFactory.createContainer, aqui eu digo qual adpter eu vou utilizar e qual POJO eu quero expor. Depois eu monto a URL que o WS-REST vai responder com o UriBuilder. Finalmente o WS-RESt é criado no Grizzly com o GrizzlyServerFactory.
Agora vamos ao código cliente. Após subir o server a qualquer momento você pode digitar no Browser:
- http://127.0.0.1:10101/groovy-pojo
- http://127.0.0.1:10101/groovy-pojo/diego
GroovyRESTClient.groovy
package com.blogspot.diegopacheco.groovy.rest.client; import groovy.util.GroovyTestCase import com.sun.grizzly.http.SelectorThread; import com.sun.grizzly.tcp.Adapter; import com.sun.jersey.api.container.ContainerFactory; import com.sun.jersey.api.container.grizzly.GrizzlyServerFactory; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; import java.io.IOException; import java.net.URI; import java.util.HashMap; import java.util.Map; import javax.ws.rs.core.UriBuilder; import com.blogspot.diegopacheco.groovy.rest.server.*; /** * * Client Groovy que consome o WS-RESt feito em Groovy. * * @autor Diego Pacheco * @since 05/01/2009 * @version 1.0 * **/ ws = Client.create().resource(UriBuilder.fromUri("http://localhost/").port(10101).build()); println "Retorno do WS-REST foi 1: " + ws.path("groovy-pojo").get(String.class) println "Retorno do WS-REST foi 2: " + ws.path("groovy-pojo/diego").get(String.class)
Através do Client.create() acessei o WS-RESt feito em Groovy e depois para usar os métodos publicados foi utilizado o .path() para dar o path e por fim disse como eu queria pegar o retorno, nesses casos tudo é String.
Se Alguem quizer o código está disponível aqui. Utilizei o plugin do Groovy para o eclipse, se tiverem problemas com plugin do Groovy na versão 3.4.1 do eclipse verifiquem isso.