Em um esforço para trazer a expressividade do ruby e os frameworks REST do Java, Charles Nutter torna possível desenvolver serviços RESTful utilizando JRuby+Rails. Ele observa o esforço das comunidades de Ruby e Rails em desenvolver aplicações RESTful que alavancam a web.
[...] Os rubistas tem ajudado a desbravar o caminho, construindo aplicações repletas de REST em praticamente tudo que eles escrevem. O próprio Rails é construído em torno do REST, contando com a maioria dos constrollers trabalhando como interfaces RESTful, e além disso permite ferramentas adicionais que ajudam a realizar chamadas REST de outras aplicações de forma transparente. Se você está fazendo serviços RESTful para uma aplicação Ruby típica, o Rails é o caminho a ser seguido.
Para demonstrar a habilidade de definir um serviço RESTful em JRuby, ele examina as soluções existentes para bibliotecas e frameworks destinados a construir serviços RESTful em Java. Ele começa com um simples exemplo de serviço utilizando o padrão da API JAX-RS.
Eu segui o tutorial Getting Started do Jersey utilizando Ruby para tudo (e sem utilizar o Maven neste caso). A minha versão do HelloWorldResource deles fica assim em Ruby:
require 'java'java_import 'javax.ws.rs.Path' java_import 'javax.ws.rs.GET' java_import 'javax.ws.rs.Produces' java_package 'com.headius.demo.jersey' java_annotation 'Path("/helloworld")' class HelloWorld java_annotation 'GET' java_annotation 'Produces("text/plain")' def cliched_message "Hello World" end end
Ele descreve como o que ocorre por trás quando uma classe do ruby é compilada e descreve a representação em memória de um objeto.
Nos bastidores, esta classe irá carregar no fonte do nosso arquivo restful_service.rb e juntar todos os pedaços do Java e do Ruby, fazendo com que ambos possam ver o HelloWorld como a representação da classe HelloWorld. As chamadas de método são enviadas ao código Ruby, construtores enviam para o initialize, e por ai vai. Está realmente pertencendo aos dois mundos. Com o serviço em mãos, agora nós precisamos de um script de servidor para começar.
Ele prossegue lidando com o complicado CLASSPATH para o exemplo rodar.
Eu os coloquei na minha variável de ambiente CLASSPATH, mas sinta-se a vontade para fazer como você quiser.
jersey-core-1.2.jar jersey-server-1.2.jar jsr311-api-1.1.1.jar asm-3.1.jar grizzly-servlet-webserver-1.9.9.jar
Os quatro primeiros estão disponíveis em: jersey-archive download, e o último você pode encontrar no Maven ou outro lugar.
Ele conclui pedindo "exemplos para outras APIs que utilizam annotation que podemos testar com o Ruby". Há exemplos interessantes no fórum e visite o post original para detalhes de como desenvolver serviços RESTful com JRuby.