Как поддерживать обратную совместимость с изменениями в обработке заголовка Accept в Rails 2.3.4 - PullRequest
3 голосов
/ 23 октября 2009

В Rails 2.3.4 изменился способ обработки заголовков Accept:

http://github.com/rails/rails/commit/1310231c15742bf7d99e2f143d88b383c32782d3

Мы не примем это

Обновлен способ, которым Rails обрабатывает входящие заголовки Accept. Это было связано прежде всего с тем фактом, что веб-браузеры, кажется, не всегда знают, чего они хотят ... не говоря уже о том, чтобы последовательно сформулировать это. Таким образом, заголовки Accept теперь используются только для запросов XHR или заголовков отдельных элементов - это означает, что они не запрашивают все. Если это не поможет, мы вернемся к использованию params [: format].

Стоит также отметить, что запросы к действию, в котором вы объявили только шаблон XML, больше не будут автоматически обрабатываться для запроса HTML (запроса браузера). Ранее это работало, но не обязательно по замыслу, а потому, что большинство браузеров отправляют универсальный заголовок Accept (" / "). Поэтому, если вы хотите предоставлять XML напрямую браузеру, обязательно предоставьте формат: xml или явно укажите шаблон XML (представьте "template.xml").

У меня есть активный API, который используется многими клиентами, которые все отправляют заголовки Content-Type и Accept, оба установлены на application/xml. Это работает нормально, но мое тестирование под Rails 2.3.4 показывает, что это больше не работает - я получаю 403 Unauthorized response. Удалите заголовок Accept и просто отправьте Content-Type, но это явно неприемлемое решение, поскольку для этого потребуется, чтобы все мои клиенты перекодировали свои приложения.

Если я продолжу развертывание на Rails 2.3.4, все клиентские приложения, использующие API, будут повреждены. Как я могу изменить свое приложение на Rails так, чтобы я мог продолжать обслуживать существующие запросы API на Rails 2.3.4 без необходимости изменения своего кода клиентами?

Ответы [ 2 ]

2 голосов
/ 26 октября 2009

Довольно смущающе, но это оказалось проблемой конфигурации Apache. Как только я решил это, все заработало как положено. Извините за это.

Как правильно указал coderjoe, установка заголовка Content-Type вообще не требуется - только установка заголовка Accept.

2 голосов
/ 23 октября 2009

Если я правильно понимаю, проблема в заголовках запроса. Вы можете просто добавить пользовательское промежуточное ПО Rack, которое исправляет его.

Быстрая идея:

class AcceptCompatibility
  def initialize(app)
    @app = app
  end

  def call(env)
    if env['Accept'] == "application/xml" && env['Content-Type'] == "application/xml"
      # Probably an API call
      env.delete('Accept')
    end
    @app.call(env)
  end
end

А потом в вашем окружении. Rb

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