تحليل حمولة JSON في Rails عند استخدام نوع MIME المخصص
-
06-07-2019 - |
سؤال
يحتاج تطبيق Rails ذو واجهة RESTful إلى قبول بيانات POST باستخدام نوع MIME مخصص يعتمد على "application/json".لنستدعي نوع MIME هذا "application/vnd.com.example.Foo+json".
تسجيل نوع MIME المخصص في Rails باستخدام Mime::Type.register يعمل بشكل جيد حيث يتعرف التطبيق على نوع MIME الوارد في رأس "Accept:" ويعرض عرض JSON من خلال Response_to.
تكمن المشكلة في أساليب التحكم مثل التحديث والإنشاء التي تحتاج إلى تحويل البيانات المخصصة بتنسيق JSON إلى تجزئة معلمات.إذا قمت بتعيين رأس "نوع المحتوى:" على application/json، فسيتم تحليل البيانات في تجزئة المعلمات.
ولكن إذا قمت بتعيين رأس "نوع المحتوى:" على "applcation/vnd.com.example.Foo+json"، فلن يتم تحليل الحمولة.
لذا يبدو أن MIME::Type.register يُستخدم لقيادة كتلة Response_to، ولكن ليس في تحديد كيفية تحليل الحمولات لطرق الإنشاء والتحديث.
أيه أفكار؟
المحلول
بالنسبة لأولئك الذين قد يكونون مهتمين، وجدت الإجابة على سؤالي.
استخدم شيئًا مثل هذا في mime_types.rb (أو ربما في مكان آخر في تسلسل التهيئة الخاص بك):
ActionController::Base.param_parsers[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body|
JSON.parse body
end
صيد واحد:لا تستخدم الأحرف الكبيرة في نوع MIME أعلاه (على سبيل المثال، "application/vnd.com.example.Foo+json").يقوم ريلز بتحويل نوع MIME إلى أحرف صغيرة، لذلك لن يتم العثور على أي تطابق إذا تم ضبطه على أحرف كبيرة.
نصائح أخرى
في Rails 3 قم بما يلي:
ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body|
JSON.parse(body)
end
في Rails 5 قم بما يلي:
ActionDispatch::Request.parameter_parsers[Mime::Type.lookup('application/vnd.api+json').symbol] = lambda do |body|
JSON.parse(body)
end