on Linguaggi di programmazione

Trasformare un’applicazione Rails in un Web Service

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.

scrivi un commento

Commento

Ricevi un avviso se ci sono nuovi commenti. Oppure iscriviti senza commentare.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.