API-вызов работает в REST-клиенте, но не в браузере

Вопрос или проблема

Просто делаю простое приложение “Hello World” на Ruby on Rails: https://guides.rubyonrails.org/getting_started.html#using-concerns

Очень просто, но почему-то я сталкиваюсь с проблемой, когда открываю URL http://localhost:3000/articles в браузере.

Это вызов из клиента REST, который работает

Started GET "/articles" for ::1 at 2024-09-19 21:13:06 -0700
Processing by ArticlesController#index as */*
  Rendering layout layouts/application.html.erb
  Rendering articles/index.html.erb within layouts/application
  Rendered articles/index.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
  Rendered layout layouts/application.html.erb (Duration: 300.6ms | GC: 83.0ms)
Completed 200 OK in 305ms (Views: 303.0ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 83.0ms)

Это вызов из браузера, который не работает

Started GET "/articles" for ::1 at 2024-09-19 21:14:13 -0700
Processing by ArticlesController#index as HTML
  Rendering public/406-unsupported-browser.html
  Rendered public/406-unsupported-browser.html (Duration: 0.5ms | GC: 0.0ms)
Filter chain halted as #<Proc:0x000000010faa86f0 /Users/joe/.rbenv/versions/3.3.4/lib/ruby/gems/3.3.0/gems/actionpack-7.2.1/lib/action_controller/metal/allow_browser.rb:48 (lambda)> rendered or redirected
Completed 406 Not Acceptable in 5ms (Views: 1.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 1.8ms)

Меня интересует, в чем проблема: ArticlesController#index as HTML, когда похоже, что моё приложение возвращает layouts/application.html.erb

Я пробовал как в Chrome, так и в Safari, но без успеха. Насторожило то, что если я сохраняю ответ клиента REST как whatever.html и открываю его в Chrome, он отображается нормально.

Для тех, кто столкнулся с подобной проблемой

Закомментировав строку allow browser modern в вашем контроллере приложения, я решил проблему

Ответ или решение

Проблема, с которой вы столкнулись, возникает из-за механизма, встроенного в ваш Ruby on Rails-приложение, который обрабатывает HTTP-заголовок Accept, передаваемый браузером. Как видно из логов, REST-клиент отправляет запрос с заголовком Accept: */*, тогда как ваш браузер может отправлять запрос с заголовком Accept: text/html.

Когда вы попытались открыть URL-адрес http://localhost:3000/articles в браузере, сервер отошел к ошибке 406 Not Acceptable, что означает, что он не смог обработать запрос из-за некорректных заголовков. В данном случае приложение отправляет ответ 406-unsupported-browser.html, что указывает на то, что ваше приложение настроено для отклонения запросов от «неконтролируемых» или «устаревших» браузеров.

Решение вашей проблемы заключается в отключении проверки браузера, которая, вероятно, была включена в вашем ApplicationController. Как вы уже заметили, комментирование строки, относящейся к allow_browser modern, приводит к правильной обработке запроса. Возможно, это выглядит как следующее:

class ApplicationController < ActionController::Base
  # ... другие настройки ...

  # закомментируйте или удалите следующую строку
  # allow_browser :modern
end

После внесения этих изменений ваше приложение должно обрабатывать запросы из браузера должным образом.

Важно отметить, что отключение этой функции может снизить безопасность приложения, так как она предназначена для защиты от старых или небезопасных браузеров. Вам стоит рассмотреть возможность настройки или обновления механизма, который проверяет поддерживаемые браузеры, чтобы избежать этой проблемы в будущем, не подвергая приложение риску, связанному с безопасностью.

Если вы хотите оставить проверку браузера включенной, возможно, стоит рассмотреть обновление вашего браузера или его настройку, чтобы он отправлял корректные заголовки в соответствии с вашими требованиями. Тем не менее, отмена этой проверки является более простым решением, которое устраняет вашу текущую проблему.

Оцените материал
Добавить комментарий

Капча загружается...