2013-07-15 9 views
9

Sto sviluppando un'API Rails e un'applicazione html5 separata. Non condividono lo stesso dominio. Come posso impostare la mia applicazione Rails per accettare richieste tra domini diversi? Ho aggiunto il seguente alla parte superiore del mio ApplicationController, ma senza alcuna fortuna -Impostazione di chiamate interdominio sul server Rails

before_filter :set_access_control_headers 

    def set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = 'http://myfrontend.com:3002' 
    headers['Access-Control-Request-Method'] = 'GET, OPTIONS, HEAD' 
    headers['Access-Control-Allow-Headers'] = 'x-requested-with,Content-Type, Authorization' 
    end 

mio javascript mia altra applicazione si presenta come segue -

var req = $.ajax({ 
    url: url, 
    type: "GET", 
    crossDomain: true, 

    success: function(data, textStatus, jqXHR) 
    { 
    alert('success'); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) 
    { 
    alert('error'); 
    } 
}); 

Quando ho eseguito questa richiesta, ho la seguente nel mio log del server -

Started OPTIONS "/api/search?location_uuid=22222222222222222" for 127.0.0.1 at 2013-07-15 16:49:56 -0400 
Processing by Api::V1::SearchController#index as JSON 
    Parameters: {"location_uuid"=>"22222222222222222"} 
WARNING: Can't verify CSRF token authenticity 
    User Load (20.5ms) SELECT "users".* FROM "users" ORDER BY name DESC LIMIT 30 OFFSET 0 
(63.1ms) SELECT COUNT(*) FROM "users" 
Completed 204 No Content in 300ms (ActiveRecord: 0.0ms) 

Qualcuno ha qualche consiglio per far funzionare correttamente questo?

+0

stupido, ma - non è stato implementato l'azione per OPZIONI? Come ti indirizzi per questo aspetto? –

+1

Prova 'after_filter' invece di' before_filter'. – mccannf

+0

Questa è un'osservazione interessante. Nella mia richiesta, specifica GET, ma il log indica che l'intestazione OPTIONS è stata impostata. Il percorso si presenta così - namespace: api, default: {formato: 'json'} fare modulo campo di applicazione:: v1 fare match "/ ricerca",: a => "Cerca indice #" fine end – Blake

risposta

4

Sembra che l'aggiunta del tipo di dati, come JSONP evita i problemi cross browser:

var req = $.ajax({ 
    url: url, 
    type: "GET", 
    crossDomain: true, 
    dataType: "JSONP", 
    ... 

Vedere questa domanda per ulteriori informazioni -

Can anyone explain what JSONP is, in layman terms?

Problemi correlati