Criando uma simples RESTful API usando Rails 3 e JSON
Autor: Vagner Zampieri | Publicado: 2012-04-20T19:24:00-07:00


O exemplo de API utilizando JSON que vou fazer aqui é bem simples. Alguns podem se perguntar "Por que ele não faz com XML?", e eu respondo, você está no post errado, a busca certa no Sr. Google é "API XML Rails", ou algo parecido com isso. Criei esse post por que precisei fazer uns testes de criação de API, tanto para o meu trabalho, quanto para a faculdade, então compartilho minha experiência com vocês. As referências que utilizei para fazer o meu exemplo estão abaixo.

Utilizei JRuby e PostgreSQL para essa aplicação, coloque o banco e ruby que quiser, se não estiver usando JRuby não copie "jruby -S". Crie uma aplicação rails

&nbsp; jruby -S rails new zapi_blog -d postgresql

Verifique se o seu Gemfile está parecido com esse aqui:

&nbsp; source 'http://rubygems.org'

&nbsp; gem 'rails', '3.1.3'

&nbsp; # Bundle edge Rails instead:
&nbsp; # gem 'rails', &nbsp; &nbsp; :git =&gt; 'git://github.com/rails/rails.git'

&nbsp; gem 'activerecord-jdbcpostgresql-adapter'

&nbsp; gem 'jruby-openssl'
&nbsp; gem 'json'
&nbsp; gem 'pg'
&nbsp; gem 'execjs'
&nbsp; gem 'therubyrhino'
&nbsp; gem 'rack-cache', :require =&gt; 'rack/cache'

&nbsp; # Gems used only for assets and not required
&nbsp; # in production environments by default.
&nbsp; group :assets do
&nbsp; &nbsp; gem 'uglifier', '&gt;= 1.0.3'
&nbsp; end

&nbsp; gem 'jquery-rails'

Crie um scaffold Post

jruby -s rails g scaffold Post title:string body:text

Crie e rode as migrações criadas no banco. Vamos ao controller para modificar algumas coisas, prefiro ele bem simplificado, mudo de lugar o "respond_to" que o rails gera e coloco de uma forma mais elegante utilizando "respond_with".

&nbsp; respond_to :html, :json

&nbsp; # GET /posts
&nbsp; # GET /posts.json
&nbsp; def index
&nbsp; &nbsp; @posts = Post.all

&nbsp; &nbsp; respond_with @posts
&nbsp; end

Inicie sua app e entre em "/posts.json" e abra uma outra aba com "/posts", elas contém o mesmo resultado, só que mostram de formas diferentes. O Rails facilita muito a vida de quem quer criar uma app, de uma forma bem simples é possível injetar os posts de fora da aplicação. Utilizando o "curl", pode ser feito um teste bem simples.

&nbsp;curl -d 'post[title]=Post1&amp;post[body]=Post1' http://localhost:3000/posts.json

&nbsp;Nesse teste consigo injetar um post utilizando a URL do "/posts.json". Vou criar um script com ruby para criar os posts, o script irá pegar os dados de um banco de dados já criado e populado, através de JSON irá enviar os posts para a aplicação que está rodando no servidor local.

&nbsp;Criei os diretórios "rest_api/lib", coloquei dois aquivoes "api.rb" e "post.rb".

&nbsp;rest_api/lib/post.rb

&nbsp; class Post &lt; ActiveRecord::Base
&nbsp; end

rest_api/lib/api.rb

&nbsp; require 'rubygems'
&nbsp; require 'active_record'
&nbsp; require 'json'
&nbsp; require 'net/http'
&nbsp; require 'uri'

&nbsp; ActiveRecord::Base.establish_connection(
&nbsp; &nbsp; :adapter =&gt; "postgresql",
&nbsp; &nbsp; :host =&gt; "localhost",
&nbsp; &nbsp; :username =&gt; "oquevoceusar",
&nbsp; &nbsp; :password =&gt; "suasenhaaquiounao",
&nbsp; &nbsp; :database =&gt; "umbancodedadosqualquer"
&nbsp; )

&nbsp; require 'post'

&nbsp; class Api
&nbsp; &nbsp; host = 'localhost:3000'
&nbsp; &nbsp; url = 'http://localhost:3000/posts.json'
&nbsp; &nbsp; uri = URI.parse(url)
&nbsp; &nbsp; post_ws = '/posts.json'

&nbsp; &nbsp; posts = Post.all
&nbsp; &nbsp; posts.each do |p|
&nbsp; &nbsp; &nbsp; post = {'title' =&gt; p.title, 'body' =&gt; p.body}.to_json
&nbsp; &nbsp; &nbsp; req = Net::HTTP::Post.new(post_ws, initheader = {'Content-Type' =&gt; 'application/json'})
&nbsp; &nbsp; &nbsp; req.body = post
&nbsp; &nbsp; &nbsp; response = Net::HTTP.new(uri.host, uri.port).start {|http| http.request(req)}
&nbsp; &nbsp; &nbsp; puts "Response #{response.code} #{response.message}: #{response.body}"
&nbsp; &nbsp; end
&nbsp; end

É possível também passar parametros de usuário e senha, entre outras coisas de segurança por esse script e fazer a verificação na app, mas isso é um outro post. Não vou explicar em detalhes o que esse script faz, se você está olhando esse post é por que já tem uma noção boa de ruby on rails, então vá tirar suas dúvidas na API do Ruby ou do Rails, o Sr. Google também ajuda.

Referências:
https://www.socialtext.net/open/very_simple_rest_in_ruby_part_3_post_to_create_a_new_workspace
http://gavinmorrice.com/blog/posts/21-building-a-rest-api-in-rails-3
http://squarism.com/2011/04/01/how-to-write-a-ruby-rails-3-rest-api/
http://blog.project-sierra.de/archives/1788