Cómo admitir la compatibilidad con versiones anteriores con los cambios en el manejo del encabezado Aceptar en Rails 2.3.4

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

  •  06-07-2019
  •  | 
  •  

Pregunta

En Rails 2.3.4, la forma en que se manejan los encabezados Aceptar ha cambiado:

  

No lo aceptaremos

     

La forma en que Rails maneja los encabezados de aceptación entrantes se ha actualizado. Esto se debió principalmente al hecho de que los navegadores web no siempre parecen saber lo que quieren ... y mucho menos pueden articularlo constantemente. Por lo tanto, los encabezados Aceptar ahora solo se usan para solicitudes XHR o encabezados de elementos individuales, lo que significa que no están solicitando todo. Si eso falla, volvemos a usar los parámetros [: formato].

     

También vale la pena señalar que las solicitudes de una acción en la que solo ha declarado una plantilla XML ya no se procesarán automáticamente para una solicitud de HTML (solicitud de navegador). Esto había funcionado anteriormente, no necesariamente por diseño, sino porque la mayoría de los navegadores envían un encabezado Aceptar para todos (" / "). Por lo tanto, si desea servir XML directamente a un navegador, asegúrese de proporcionar el formato: xml o especifique explícitamente la plantilla XML (render " template.xml ").

Tengo una API activa que está siendo utilizada por muchos clientes que envían tanto un Content-Type como un Aceptar , ambos configurados en la aplicación / xml . Esto funciona bien, pero mi prueba bajo Rails 2.3.4 demuestra que esto ya no funciona; recibí una respuesta 403 no autorizada. Elimine el encabezado Accept y el simple envío de Content-Type funciona, pero esto claramente no es una solución aceptable, ya que requerirá que todos mis clientes vuelvan a codificar sus aplicaciones. / p>

Si procedo a implementar Rails 2.3.4, todas las aplicaciones cliente que utilizan la API se interrumpirán. ¿Cómo puedo modificar mi aplicación Rails para que pueda continuar atendiendo las solicitudes de API existentes en Rails 2.3.4 sin que los clientes tengan que cambiar su código?

¿Fue útil?

Solución 2

Lo suficientemente vergonzoso, esto en realidad resultó ser un problema de configuración de Apache. Una vez que resolví esto, todo funcionó como se esperaba. Lo siento por eso.

Como señala coderjoe correctamente, no es necesario configurar el encabezado Content-Type , solo se establece el encabezado Aceptar .

Otros consejos

Si entiendo correctamente, el problema está en los encabezados de solicitud. Simplemente puede agregar un middleware de rack personalizado que lo corrija.

Idea 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

Y luego en tu entorno.rb

require 'accept_compatibility'
config.middleware.use AcceptCompatibility
scroll top