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

Telemetry and Microservices part2

Installing and Running ntop 2 on Amazon Linux OS

Fun with Apache Kafka