Como suportar a compatibilidade com as alterações à manipulação de cabeçalho Accept em Rails 2.3.4

StackOverflow https://stackoverflow.com/questions/1612633

  •  06-07-2019
  •  | 
  •  

Pergunta

No Rails 2.3.4, a maneira cabeçalhos Accept são tratados mudou:

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

Não vamos aceitar que

A maneira em que Rails alças entrante Aceitar cabeçalhos foi atualizado. Este foi principalmente devido ao fato de que os navegadores web nem sempre parecem saber o que eles querem ... e muito menos é capaz de consistentemente articulá-lo. Então, Aceitar cabeçalhos são agora só usado para solicitações XHR ou cabeçalhos único item - o que significa que não está pedindo tudo. Se isso falhar, nós caímos para trás a usar o params [: formato].

É importante notar também que os pedidos de uma ação em que você só declarou um modelo XML não será mais processado automaticamente para um pedido de HTML (solicitação do navegador). Este tinha trabalhado anteriormente, não necessariamente por design, mas porque a maioria dos navegadores enviar um catch-all Aceitar header ( " / "). Então, se você quer servir XML diretamente para um navegador, certifique-se de fornecer a:. Formato XML ou explicitamente especificar o modelo XML (render "template.xml")

Eu tenho uma API ativa que está sendo usado por muitos clientes que estão enviando tanto um Content-Type e um cabeçalho Accept, ambos definidos como application/xml. Esta multa funciona, mas o meu teste sob Rails 2.3.4 demonstra que este não funciona mais - eu recebo uma resposta Unauthorized 403. Remover o cabeçalho Accept e apenas o envio de trabalhos Content-Type, mas isso claramente não é uma solução aceitável, uma vez que vai exigir que todos os meus clientes recodificar suas aplicações.

Se eu avançar para implantar em Rails 2.3.4 todos os aplicativos cliente que usam a API vai quebrar. Como posso modificar meus Rails app tal que eu possa continuar a atender as solicitações de API existentes no Rails 2.3.4 sem os clientes ter que alterar seu código?

Foi útil?

Solução 2

É constrangedor o suficiente, isso realmente acabou por ser um problema de configuração do Apache. Uma vez que eu resolvi isso, tudo funcionou como esperado. Desculpe por isso.

Como coderjoe corretamente apontou, definindo o cabeçalho Content-Type não é necessário em tudo -. Configuração somente o cabeçalho Accept

Outras dicas

Se bem entendi o problema está nos cabeçalhos de solicitação. Você pode simplesmente adicionar um middleware cremalheira personalizada que corrige-o.

idéia rápida:

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

E, em seguida, em seu environment.rb

require 'accept_compatibility'
config.middleware.use AcceptCompatibility
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top