كيفية دعم التوافق العكسي مع التغييرات التي تم إجراؤها على قبول معالجة الرأس في Rails 2.3.4
-
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