Rails кросс-домен AJAX получить запрос (CORS)
Я пытаюсь реализовать API мест Google в моем приложении рельсы.
Это ошибка, которую я получаю при попытке использовать функцию, которая извлекает данные из запроса ajax:
XMLHttpRequest cannot load . Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.
Я использую гем-стойку и добавил этот фрагмент в файл config/application.rb:
config.middleware.insert_before 0, "Rack::Cors" do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
Это запрос ajax с моей точки зрения (coffeescript):
$.ajax
url: url
dataType: "json"
type: "GET"
Я добавил эту часть в свой application_controller
before_filter :cors_preflight_check
after_filter :cors_set_access_control_headers
def cors_set_access_control_headers
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = '*'
headers['Access-Control-Max-Age'] = "1728000"
end
def cors_preflight_check
if request.method == :options
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = '*'
headers['Access-Control-Max-Age'] = '1728000'
render :text => '', :content_type => 'text/plain'
end
end
и это, к моему файлу маршрутов
match '*path' => 'application#cors_preflight_check', :via => :options
Я заметил, что метод "cors_preflight_check" не запускается моим запросом. (Я делаю запрос AJAX, когда нажимаю на определенную ссылку в моем представлении)
и я заметил, что мои заголовки запроса остаются неизменными.
(Access-Control-Allow-Origin не добавляется в заголовки запроса)
JSONP не вариант, потому что он не поддерживается местами API
Перепробовал все что написано в этих темах:
- https://github.com/cyu/rack-cors/issues/33
- Не удается заставить стойки работать в приложении rails (config.middleware.insert 0, Rack:: Cors do)
- https://demisx.github.io/rails-api/2014/02/18/configure-accept-headers-cors.html
- Метод POST не работает в направляющих Rack-Cors 4 (добавление действий до и после в контроллере приложения)
- Добавьте пользовательский заголовок ответа с Rack-cors и Grape (используя: ключ expose)
1 ответ
Я пытаюсь реализовать API мест Google в моем приложении рельсы.
Вы, кажется, смущены тем, что делает CORS. Если вы пытаетесь выполнить вызов Ajax, например, https://maps.googleapis.com
единственное, что имеет значение, это заголовки CORS, отправленные в ответе Google. Если это не работает, возможно, вы пытаетесь использовать устаревшую конечную точку версии API.
Вместо этого выполните следующие действия: https://developers.google.com/maps/documentation/javascript/examples/place-search
Если вы хотите, чтобы ваше приложение могло предоставлять данные другим доменам, вы должны предоставить заголовки CORS. Но это не очень вероятно, что вызывает вашу проблему, если вы не делаете приложение API Rails, которое используется отдельным интерфейсом.
Посмотрите Использование CORS для учебника о том, как работает CORS.
CSP (политика безопасности контента), с другой стороны, позволяет вам устанавливать более строгие правила для междоменных запросов. Но в этом случае нет необходимости, поскольку Google предоставляет заголовки CORS для своих веб-служб.