2011-11-15 18 views
6

Ho un'app Rails 3.1 per cui voglio creare un'API. Voglio che i miei URL per guardare qualcosa di simile:Rails 3.1 Percorsi API

www.example.com/controller/action // Normal Web requests 
api.example.com/controller/action.json // API requests 

Il primo sarebbe per le richieste normali e l'altro ovviamente per la mia roba API. Vorrei che entrambi fossero mappati allo stesso controller/azione.

Come si configura la mia applicazione in modo che risponda solo a HTML quando su www e json, xml, ecc quando sono sul sottodominio api?

+3

Se si intende creare un'API da utilizzare esternamente, si consiglia di utilizzare controller separati. La gestione degli errori è completamente diversa per un'API e l'interfaccia utente. Anche la gestione delle eccezioni è per noi totalmente diversa. Se un metodo API attiva un'eccezione, lo formiamo su xml e lo restituiamo con lo stato HTTP corretto. – nathanvda

risposta

21

Il modo più semplice (imo) sarebbe utilizzare i vincoli di instradamento di Rails 3. In config/routes.rb, utilizzare:

constraints :subdomain => 'www', :format => :html do 
    # Routing for normal web requests 
    match 'mycontroller/:action' => 'mycontroller#index' 
    # ... 
end 

constraints :subdomain => 'api', :format => :json do 
    # Routing for API requests 
    match 'mycontroller/:action.:format' => 'mycontroller#index' 
    # ... 
end 

Si potrebbe anche voler dare un'occhiata in respond_with (e respond_to a livello di classe), che lo rende molto più facile da scrivere controller che rispondono alle più formati rispetto ai tradizionali rispondere a.

3

Verifica #221 Subdomains in Rails 3 Rotaie Cast. Per www puoi inserire ulteriori contstraint ": format =>: html". Un'altra soluzione potrebbe essere l'uso del filtro controller che controlla request.subdomain e params [: format]. Quindi non è necessario duplicare percorsi.