Good Ideas

Trasformare un’applicazione Rails in un Web Service

Posted by:

|

On:

|

Mi è capitato di dover creare un web service partendo da un’applicazione rails già funzionante. Il lavoro è semplice visto che rails utilizza l’indirizzamento restful e che produrre un XML è un gioco da ragazzi.

L’unico problema da risolvere è l’autenticazione. L’applicazione nativamente accetta un’autenticazione usando le sessioni. Dobbiamo ora creare un’autenticazione http-basic nel caso si voglia accedere ai metodi pubblici via web service. Le modifiche da fare sono poche.

In application_controller.rb inseriamo questo codice:

[code lang=”rails” toolbar=”true”]
class ApplicationController < ActionController::Base

before_filter :check_authentication, :except => [[:login], [:forgot]]

def check_authentication
case request.format
# webservice authentication
when Mime::XML, Mime::ATOM
if user = authenticate_with_http_basic { |u, p| User.authenticate(u, p) }
@current_user = user
session[:user] = user.id
session[:username] = user.username
else
request_http_basic_authentication
end
# web authentication
else
unless session[:user]
redirect_to :controller=>"account", :action => "login"
else
@current_user=User.find(session[:user])
end
end
[/code]

Come vedete distinguo il tipo di autenticazione in base al mime type richiesto. Se si richiede un tipo Mime::XML allora viene lanciato il metodo authenticate_with_http_basic. Altrimenti l’autenticazione è normale usando le sessioni (utente che usa il browser).

Quindi se lanciate la richiesta http://localhost:3000/products/index.xml si entrerà nel ramo webservice (http basic access authentication), se lanciate la richiesta http://localhost:3000/products/ si entrerà nel ramo dell’autenticazione tradizionale.

Ora non ci resta che implementare le viste XML. Nei controller assicuratevi di aver sviluppato il ramo format.xml in questo modo:

[code lang=”rails” toolbar=”true”]
class ProjectsController < ApplicationController
def index
@projects = Project.find(:all)
respond_to do |format|
format.html { render :layout => "index" }
format.xml { render :xml => @projects.to_xml }
end
end
[/code]

Il comodo helper .to_xml si occuperà di formattare la nostra istanza (@projects nel nostro esempio) in modo da ottenere un output xml corretto.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *