Почему rails не распознает `Accept: application / json` в заголовке запроса? - PullRequest
1 голос
/ 20 сентября 2019

У меня есть некоторый javascript-интерфейс, который выполняет асинхронный http-запрос к моему внутреннему rails-серверу.На фронтенде я не использую XHR (я использую axios, хотя это не совсем относится к вопросу).

В запросе я установил следующее, чтобы сообщить серверу, который отправляю JSON, и убедиться, что я возвращаю JSON:

const config = {
  headers: {
    "Content-Type": "application/json",
    "Accept": "application/json"
  }
};

В моем внутреннем контроллере Rails, если проверять запросЯ могу проверить заголовок Accept:

> request.headers
"HTTP_ACCEPT"=>"application/json, text/plain, */*"

Однако ActionPack / Rails все еще не учитывает это и по умолчанию format является :html

> request.format
=> #<Mime::Type:0x00007fe223919f80 @hash=-1773238723920954657, @string="text/html", @symbol=:html, @synonyms=["application/xhtml+xml"]>

Почему это так??

Я знаю, что могу добавить .json к URL моего запроса, чтобы "принудительно" указать этот формат, но разве это единственный вариант?Я могу легко добавить его, но это похоже на реализацию, специфичную для Rails, а не на «правильный» подход.

Кроме того, исходный код для метода request.format явно устанавливает :json в качестве формата для запросов XHR - рельсы только учитывают запросы XHR в настоящее время?

Спасибо!

1 Ответ

0 голосов
/ 20 сентября 2019

То, что вы делаете, правильно, но при отправке запросов API Axios / Fetch из браузера будет отображаться ошибка «CORS» со стороны браузера (вы можете увидеть это в консоли инструментов вашего браузера).Подробнее об этом можно узнать из Документов MDN

. Чтобы решить эту проблему, вам необходимо отправить заголовок Access-Control-Allow-Origin на запросы, полученные на веб-сервере.Вы можете сделать это вручную, добавив этот заголовок в application_controller.rb или просто используйте гем типа rack-cors.Я покажу вам, как это сделать, используя rack-cors gem:

  • Добавьте gem 'rack-cors' в ваш Gemfile
  • Запустите команду bundle i
  • В вашем файле config/application.rb добавьте следующие строки:

    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins '*'
        resource '*', headers: :any, methods: [:get, :post, :options]
      end
    end
    
  • Теперь перезапустите сервер rails

  • Вы также можете увидеть выше инструкциии более подробная информация здесь

Теперь снова выполните вызов API, не вводя .json в конце URL, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...