سؤال

يحتاج تطبيق 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top