2014-11-18 8 views
5

Ho un'API di sola lettura e funziona bene localmente con una configurazione di Vagrant. In diretta sulla mia app di Heroku, ogni richiesta API viene negata a causa di un errore CORS: "Nessuna intestazione Access-Control-Allow-Origin" è presente sulla risorsa richiesta. L'origine "null" non è quindi consentita l'accesso. "Problema CORS utilizzando Grape API e Heroku

Nella classe di base del mio API, ho il seguente per impostare le intestazioni:

module API 
    class Base < Grape::API 
    before do 
     headers['Access-Control-Allow-Origin'] = '*' 
     headers['Access-Control-Allow-Methods'] = 'GET, OPTIONS' 
     headers['Access-Control-Request-Method'] = '*' 
     headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization' 
    end 

    mount API::V1::Base 
    end 
end 

ho il sospetto che questo before chiamata non viene licenziato, se uso una dichiarazione mette all'interno di esso, questa affermazione fa non appare nella mia console con il resto dell'output.

Sono in perdita. Spero che qualcuno abbia qualche esperienza con questo. Grazie.

Modifica: Ho anche seguito Grape's CORS instructions ma ottengo lo stesso risultato.

Successo. Ho usato il rack-cors gemma e la seguente:

#application.rb 
config.middleware.use Rack::Cors do 
    allow do 
    origins '*' 

    # location of your API 
    resource '/api/*', :headers => :any, :methods => [:get, :post, :options, :put] 
    end 
end 

risposta

4

Si ottiene errore Access-Control-Allow-Origin ogni volta che avete fatto una richiesta.

Ciò è probabilmente dovuto al fatto che l'API del server non risponde alle richieste OPZIONI con le intestazioni richieste per CORS.

È possibile verificarlo nella console di sviluppo -> scheda di rete se si utilizza Google Chrome.

È interessante notare che alcuni framework JavaScript eseguono una richiesta OPTIONS prima che una richiesta normale venga inviata al server.

Soluzione:

  1. Modificare la tua Gemfile per includere 'a cremagliera cors'.
  2. Run bundle install
  3. Modificare la config.ru:

* se si ottiene gli errori di lancio del server rotaie, controllare lo spazio dei nomi API dopo la 'corsa'

require 'rack/cors' 

use Rack::Cors do 
    allow do 
    origins '*' 
    resource '*', headers: :any, methods: [:get, :post, :options, :put] 
    end 
end 

run API::V1::Base 

Ora dovresti vedere Grape che gestisce tutte le richieste OPTIONS con le intestazioni CORS.

+0

Sì, avevo già pubblicato la soluzione di successo nel mio post originale. Grazie. – Stephen

+0

Oh. Ho appena realizzato che la mia risposta copiata da grape docs non includeva il metodo delle opzioni. È aggiornato ora. ([: get,: post,: options,: put] invece di just: get) – Ryanzyy

+0

Basta notare per il framework rails, all'interno di config.ru, aggiungere la riga 'run API :: V1 :: Base' prima della riga' run Rails. application' – yozzz

Problemi correlati