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

Перепробовал все что написано в этих темах:

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 для своих веб-служб.

Другие вопросы по тегам