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
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.
É importante reparar que o POJO tem uma anotação de @Path isso significa que ele só será acessível por esse caminho. Agora vamos ao código do Servidor.

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
Des de que o server esteja no ar é claro :) O código cliente foi escrito em Groovy também, mais uma vez pela simplicidade e facilidade, você poderia escrever em outra linguagem.

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.

Popular posts from this blog

Cool Retro Terminal

Mocking Terraform AWS using Docker

Go and Redis running on Kubernetes with Minukube