2014-11-18 9 views
5

Ich habe eine schreibgeschützte API und es funktioniert gut lokal mit einem Vagrant-Setup. Live in meiner Heroku-App wird jede API-Anfrage aufgrund eines CORS-Fehlers abgelehnt: "Kein 'Access-Control-Allow-Origin'-Header ist auf der angeforderten Ressource vorhanden. Daher ist' Null 'nicht erlaubt."CORS Problem mit Grape API und Heroku

In meiner API der Basisklasse, ich habe nach dem die Header zu setzen:

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 

Ich vermute, dass dieser before Anruf nicht gefeuert-wenn wird ich eine puts Anweisung innerhalb davon verwenden, diese Aussage tut nicht in meiner Konsole mit dem Rest der Ausgabe erscheinen.

Ich bin ratlos. Hoffentlich hat jemand etwas Erfahrung damit. Vielen Dank.

Bearbeiten: Ich habe auch Grape's CORS instructions gefolgt, aber das gleiche Ergebnis erhalten.

Erfolg. Ich benutzte die rack-cors Juwel und die folgende:

#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 

Antwort

4

Sie erhalten Fehler Access-Control-Allow-Origin jedes Mal, wenn Sie eine Anfrage gemacht.

Dies liegt wahrscheinlich daran, dass Ihre Server-API nicht auf OPTIONS Anfragen mit den für CORS erforderlichen Kopfzeilen antwortet.

Sie können es in der Entwicklungskonsole -> Netzwerk Registerkarte überprüfen, wenn Sie Google Chrome verwenden.

Es ist interessant, dass einige Javascript-Frameworks eine OPTIONS-Anfrage machen, bevor eine normale Anfrage an den Server gesendet wird.

Lösung:

  1. Ändern Sie bitte Ihre Gemfile 'Rack-cors' aufzunehmen.

* wenn Sie Fehler Server starten Schienen erhalten, Ihre API-Namespace nach 'run' überprüfen

require 'rack/cors' 

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

run API::V1::Base 

Jetzt:

  • Run Bündel
  • Ändern Sie bitte Ihre config.ru installieren Sie sollten sehen, dass Grape alle OPTIONS-Anfragen mit den CORS-Headern behandelt.

  • +0

    Ja, ich hatte die erfolgreiche Lösung bereits in meinem ursprünglichen Beitrag gepostet. Vielen Dank. – Stephen

    +0

    Oh. Ich habe gerade festgestellt, dass meine Antwort, die ich aus der Traube der Trauben kopiert habe, nicht die Optionsmethode enthielt. Es ist jetzt aktualisiert. ([: get,: post,: options,: put] statt nur: get) – Ryanzyy

    +0

    Nur für Rails-Framework, innerhalb config.ru, fügen Sie Zeile 'run API :: V1 :: Base' vor Zeile 'run Rails. Anwendung " – yozzz