[http] application / x-www-form-urlencoded أو multipart / form-data؟



1 Answers

اقرأ على الأقل أول PARA هنا!

أعلم أن هذا قد تأخر أكثر من 3 سنوات ، ولكن إجابة "مات" (المقبولة) غير مكتملة وستؤدي في نهاية المطاف إلى ورطة. المفتاح هنا هو أنه إذا اخترت استخدام multipart/form-data ، يجب ألا يظهر الحد في بيانات الملف التي يتلقاها الخادم في النهاية.

هذه ليست مشكلة بالنسبة application/x-www-form-urlencoded ، نظرًا لعدم وجود حدود. يمكن أن يتعامل x-www-form-urlencoded دائمًا مع البيانات الثنائية ، من خلال وسيلة بسيطة لتحويل بايت تعسفي واحد إلى ثلاث وحدات 7BIT . غير فعالة ، لكنها تعمل (وتلاحظ أن التعليق على عدم القدرة على إرسال أسماء الملفات بالإضافة إلى البيانات الثنائية غير صحيح ، فأنت ترسله فقط كزوج آخر رئيسي / قيمة).

المشكلة مع multipart/form-data هي أن فاصل الحدود يجب أن لا تكون موجودة في بيانات الملف (راجع RFC2388 ؛ المقطع 5.2 يتضمن أيضاً عذر lame بدلاً من وجود نوع MIME التجميع الصحيح الذي يتجنب هذه المشكلة).

لذا ، للوهلة الأولى ، لا يكون multipart/form-data أي قيمة على الإطلاق في أي ملف تحميل ، ثنائي أو غير ذلك. إذا لم تختر حدودك بشكل صحيح ، فسيكون لديك مشكلة في النهاية ، سواء كنت ترسل نصًا عاديًا أو ثنائيًا عاديًا - سيجد الخادم حدودًا في المكان الخطأ ، وسيتم اقتطاع ملفك ، أو POST سوف تفشل.

المفتاح هو اختيار ترميز وحدود بحيث لا يمكن أن تظهر الأحرف المحددة في المخرجات المشفرة. حل واحد بسيط هو استخدام base64 ( لا تستخدم ثنائي الخام). في base64 يتم ترميز 3 وحدات عشوائية إلى أربعة أحرف من 7 بت ، حيث تكون مجموعة حروف الإخراج هي [A-Za-z0-9+/=] (أي alphanumerics ، أو '+' ، '/' ، '=') . = حالة خاصة ، وقد تظهر فقط في نهاية المخرجات المشفرة ، باعتبارها مفردة = أو مزدوجة == . الآن ، اختر حدودك كسلسلة ASCII 7 بت التي لا يمكن أن تظهر في إخراج base64 . العديد من الخيارات التي تراها على الشبكة تفشل في هذا الاختبار - على سبيل المثال ، يستخدم docs MDN ، "blob" كحدود عند إرسال البيانات الثنائية - ليس جيدًا. ومع ذلك ، هناك شيء مثل "! blob!" سوف تظهر أبدا في الناتج base64 .

Question

في HTTP هناك طريقتان لبيانات POST: application/x-www-form-urlencoded و multipart/form-data . أعي أن معظم المتصفحات لا تستطيع تحميل الملفات إلا إذا تم استخدام multipart/form-data . هل هناك أي إرشادات إضافية عند استخدام أحد أنواع الترميز في سياق واجهة برمجة التطبيقات (دون مشاركة المتصفّح)؟ قد يعتمد هذا على سبيل المثال على:

  • حجم البيانات
  • وجود أحرف غير ASCII
  • وجود على البيانات الثنائية (غير المشفرة)
  • الحاجة إلى نقل بيانات إضافية (مثل اسم الملف)

لم أجد أساسًا أي إرشادات رسمية على الويب فيما يتعلق باستخدام أنواع المحتوى المختلفة حتى الآن.




أتفق مع الكثير الذي قاله مانويل. في الواقع ، تشير تعليقاته إلى عنوان URL هذا ...

w3.org/TR/html401/interact/forms.html#h-17.13.4

... التي تنص على:

نوع المحتوى "application / x-www-form-urlencoded" غير فعال لإرسال كميات كبيرة من البيانات الثنائية أو نص يحتوي على أحرف غير ASCII. يجب استخدام نوع المحتوى "multipart / form-data" لإرسال النماذج التي تحتوي على ملفات وبيانات غير ASCII وبيانات ثنائية.

ومع ذلك ، بالنسبة لي سوف ينزل إلى دعم الأداة / الإطار.

  • ما هي الأدوات والأطر التي تتوقع أن يقوم مستخدمو API لديك ببناء تطبيقاتهم عليها؟
  • هل لديهم أطر أو مكونات يمكنهم استخدامها والتي تفضل طريقة واحدة على الأخرى؟

إذا حصلت على فكرة واضحة عن المستخدمين ، وكيفية الاستفادة من واجهة برمجة التطبيقات ، فسيساعدك ذلك على اتخاذ القرار. إذا جعلت تحميل الملفات صعبًا لمستخدمي واجهة برمجة التطبيقات ، فسيتم نقلهم بعيدًا ، وستقضي الكثير من الوقت في دعمهم.

ثانوي لهذا سيكون دعم الأداة الذي تملكه لكتابة API الخاص بك ومدى سهولة استخدامه لاستيعاب آلية تحميل واحدة على الآخر.






Related