Comment prendre en charge la compatibilité ascendante avec les modifications apportées à la gestion de l'en-tête Accept dans Rails 2.3.4

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

  •  06-07-2019
  •  | 
  •  

Question

Dans Rails 2.3.4, le mode de traitement des en-têtes Accept a été modifié:

disposent

  

Nous ne l'accepterons pas

     

La manière dont Rails traite les en-têtes Accept entrants a été mise à jour. Cela était principalement dû au fait que les navigateurs Web ne semblaient pas toujours savoir ce qu'ils voulaient ... et encore moins sont capables de l'articuler de manière cohérente. Ainsi, les en-têtes Accepter ne sont maintenant utilisés que pour les demandes XHR ou les en-têtes à élément unique, ce qui signifie qu'ils ne demandent pas tout. Si cela échoue, nous utilisons les paramètres [: format].

     

Il convient également de noter que les requêtes relatives à une action dans laquelle vous venez de déclarer un modèle XML ne seront plus automatiquement rendues pour une requête HTML (requête du navigateur). Cela avait déjà fonctionné auparavant, pas nécessairement par conception, mais parce que la plupart des navigateurs envoient un en-tête Accept à tout faire (" / "). Par conséquent, si vous souhaitez servir du code XML directement à un navigateur, veillez à fournir le format: xml ou à spécifier explicitement le modèle XML (render " template.xml ").

J'ai une API active utilisée par de nombreux clients qui envoient tous à la fois un en-tête Content-Type et un code Accepter , tous deux définis sur l'application . / xml . Cela fonctionne bien, mais mes tests sous Rails 2.3.4 démontrent que cela ne fonctionne plus - je reçois une réponse 403 non autorisée. Supprimez l'en-tête Accepter et envoyez simplement Content-Type , mais ce n'est clairement pas une solution acceptable, car cela nécessitera que tous mes clients recodent leurs applications. / p>

Si je procède au déploiement sur Rails 2.3.4, toutes les applications clientes utilisant l'API tomberont en panne. Comment puis-je modifier mon application Rails de manière à pouvoir continuer à servir les requêtes d'API existantes sur Rails 2.3.4 sans que les clients soient obligés de modifier leur code?

Était-ce utile?

La solution 2

Assez embarrassant, il s’est avéré qu’il s’agissait d’un problème de configuration Apache. Une fois que j'ai résolu ce problème, tout a fonctionné comme prévu. Désolé pour ça.

Comme coderjoe l’a correctement souligné, la définition de l’en-tête Content-Type n’est pas nécessaire, mais uniquement la définition de l’en-tête Accept .

Autres conseils

Si je comprends bien, le problème se trouve dans les en-têtes de demande. Vous pouvez simplement ajouter un middleware Rack personnalisé qui le corrige.

Idée rapide:

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

Et ensuite dans votre environnement.rb

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