كيفية دعم التوافق العكسي مع التغييرات التي تم إجراؤها على قبول معالجة الرأس في Rails 2.3.4

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

  •  06-07-2019
  •  | 
  •  

سؤال

في ريلز 2.3.4، الطريق Accept تم تغيير الرؤوس التي يتم التعامل معها:

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

لن نقبل ذلك

تم تحديث الطريقة التي يتعامل بها Rails مع رؤوس القبول الواردة.كان هذا يرجع في المقام الأول إلى حقيقة أن متصفحات الويب لا يبدو أنها تعرف دائمًا ما تريد ...ناهيك عن القدرة على التعبير عنها باستمرار.لذا، تُستخدم الآن قبول الرؤوس فقط لطلبات XHR أو رؤوس العناصر الفردية - مما يعني أنها لا تطلب كل شيء.إذا فشل ذلك، نعود إلى استخدام المعلمات[:format].

تجدر الإشارة أيضًا إلى أن طلبات الإجراء الذي أعلنت فيه فقط عن قالب XML لن يتم عرضها تلقائيًا بعد الآن لطلب HTML (طلب المتصفح).لقد نجح هذا سابقًا، ليس بالضرورة عن طريق التصميم، ولكن لأن معظم المتصفحات ترسل رأس قبول شامل ("/").لذا، إذا كنت تريد تقديم XML مباشرة إلى المتصفح، فتأكد من توفير تنسيق xml : أو تحديد قالب XML بشكل صريح (عرض "template.xml").

لدي واجهة برمجة تطبيقات نشطة يتم استخدامها من قبل العديد من العملاء الذين يرسلون كلاً من ملف Content-Type و Accept رأس، وكلاهما مضبوط على application/xml.يعمل هذا بشكل جيد، لكن الاختبار الذي أجريته ضمن Rails 2.3.4 يوضح أن هذا لم يعد يعمل - أحصل على استجابة 403 غير مصرح بها.مسح ال Accept رأس وإرسال فقط Content-Type يعمل، ولكن من الواضح أن هذا ليس حلاً مقبولاً لأنه سيتطلب من جميع عملائي إعادة ترميز تطبيقاتهم.

إذا تابعت النشر إلى Rails 2.3.4، فسوف تنقطع جميع تطبيقات العميل التي تستخدم واجهة برمجة التطبيقات.كيف يمكنني تعديل تطبيق Rails الخاص بي بحيث أتمكن من الاستمرار في خدمة طلبات API الحالية على Rails 2.3.4 دون أن يضطر العملاء إلى تغيير التعليمات البرمجية الخاصة بهم؟

هل كانت مفيدة؟

المحلول 2

ومن المحرج أن هذه مشكلة في تكوين Apache.وبمجرد حل هذه المشكلة، سار كل شيء كما هو متوقع.اسف بشأن ذلك.

كما أشار Coderjoe بشكل صحيح، فإن ضبط Content-Type الرأس ليس ضروريًا على الإطلاق - فقط تعيين Accept header.

نصائح أخرى

إذا فهمت بشكل صحيح المشكلة في رؤوس الطلب.يمكنك ببساطة إضافة برنامج وسيط مخصص لـ 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top