أنت تدمج مع واجهة برمجة تطبيقات (API) جديدة. تقوم بصياغة طلب JSON بعناية مع جميع البيانات الصحيحة، وترسله، وبدلاً من استجابة النجاح التي توقعتها، تتلقى خطأ محبطًا: 415 Unsupported Media Type. تتحقق مرة أخرى من مصادقتك، وعنوان URL لنقطة النهاية، وحمولة بياناتك كل شيء يبدو صحيحًا. فما الخطأ الذي حدث؟
المشكلة على الأرجح ليست في ما أرسلته، بل في كيف أخبرت الخادم بما كنت ترسله. يوضح رمز الحالة هذا الشائع ولكن غالبًا ما يكون مربكًا، حالات تعطل الاتصال في تنسيق البيانات.
خطأ 415 هو طريقة الخادم للقول: "أنا أفهم أنك تحاول إرسال بيانات لي، لكنني لا أتحدث هذه اللغة. كنت أتوقع منك إرسالها بتنسيق مختلف يمكنني معالجته فعليًا."
إذا كنت مطورًا تعمل مع واجهات برمجة التطبيقات (APIs) سواء كنت تبنيها أو تستهلكها فإن فهم رمز الحالة 415 أمر بالغ الأهمية للتكامل السلس وتجنب جلسات تصحيح الأخطاء المحبطة.
في هذا الدليل المفصل، سنستكشف معنى رمز الحالة 415 Unsupported Media Type، ولماذا يحدث، والسيناريوهات النموذجية، والطرق العملية لإصلاحه أو تجنبه. سواء كنت مطورًا يتعامل مع تكاملات واجهة برمجة التطبيقات أو فضوليًا حول كيفية عمل اتصالات الويب، سيساعدك هذا المنشور على إتقان أخطاء 415.
زر
حسنًا، دعنا نتعمق ونزيل الارتباك حول HTTP 415 مرة واحدة وإلى الأبد.
المشكلة: التحدث بلغة الخادم
تخيل أنك ترسل رسالة بالبريد إلى شخص يقرأ الفرنسية فقط. يمكنك كتابة رسالة إنجليزية بليغة ومتقنة تمامًا، ولكن إذا كان المستلم لا يفهم الإنجليزية، فستكون رسالتك عديمة الفائدة. خطأ 415 هو المكافئ الرقمي لهذا السيناريو.
غالبًا ما تُبنى خوادم الويب لفهم تنسيقات بيانات محددة. إنها تحتاج إلى معرفة "اللغة" التي كُتبت بها البيانات الواردة حتى تتمكن من تحليلها ومعالجتها بشكل صحيح. رأس Content-Type هو الطريقة التي يخبر بها العميل الخادم بتنسيق البيانات.
ماذا يعني HTTP 415 Unsupported Media Type في الواقع؟
يشير رمز الحالة 415 Unsupported Media Type إلى أن الخادم يفهم الطلب، لكنه يرفض قبوله لأن تنسيق الحمولة (نوع الوسائط) بتنسيق غير مدعوم من قبل الخادم للمورد المطلوب.
بشكل أبسط، يرسل عميلك (مثل Postman أو Apidog أو متصفحك) البيانات بتنسيق لا يفهمه الخادم أو لم يتم تكوينه لمعالجته.
يقول الخادم أساسًا: "لقد تلقيت بياناتك، لكن لا يمكنني معالجتها لأنها بتنسيق لا أفهمه أو لا أدعمه لنقطة النهاية هذه بالذات."
تبدو استجابة 415 النموذجية كالتالي:
HTTP/1.1 415 Unsupported Media TypeContent-Type: application/json
{
"error": "Unsupported Media Type",
"message": "The request payload format is not supported.",
"supported_types": ["application/json", "application/xml"]
}
يخبرك هذا، "مرحبًا! لقد تلقيت طلبك، لكن لا يمكنني معالجة نوع المحتوى هذا."
يتعلق هذا غالبًا بقيمة رأس **Content-Type** في طلب HTTP الذي يحدد تنسيق البيانات المرسلة (مثل JSON أو XML أو بيانات النموذج متعددة الأجزاء). قد توفر بعض الخوادم معلومات أكثر فائدة حول التنسيقات التي تدعمها، بينما قد تُرجع خوادم أخرى رسالة خطأ عامة أكثر.
تعمق: التعريف الفني (للفضوليين)
وفقًا لـ **مواصفات HTTP/1.1 (RFC 7231)**، يحدد القسم 6.5.13 رمز الحالة 415 على النحو التالي:
"يشير رمز الحالة 415 (Unsupported Media Type) إلى أن الخادم الأصلي يرفض خدمة الطلب لأن الحمولة بتنسيق غير مدعوم بواسطة هذه الطريقة على المورد المستهدف."
النقطة الأساسية هنا:
- تكمن المشكلة في نوع الوسائط، وليس في البيانات نفسها.
- يعرف الخادم ما تحاول إرساله ولكنه لا يستطيع معالجته.
جوهر المسألة: رأس Content-Type
رأس Content-Type هو الجزء الحاسم من المعلومات الذي يحدد ما إذا كنت ستحصل على خطأ 415 أو استجابة ناجحة. يخبر هذا الرأس الخادم بنوع البيانات التي ترسلها في نص الطلب.
فيما يلي أكثر أنواع المحتوى شيوعًا التي ستصادفها:
قيم Content-Type الشائعة:
لواجهات برمجة تطبيقات JSON:
application/json- المعيار لمعظم واجهات برمجة تطبيقات REST الحديثةapplication/json; charset=utf-8- JSON مع ترميز أحرف صريح
لبيانات النموذج:
application/x-www-form-urlencoded- تنسيق إرسال نماذج HTML التقليديmultipart/form-data- يستخدم لتحميل الملفات والنماذج التي تحتوي على ملفات
لـ XML:
application/xml- تنسيق XML القياسيtext/xml- تنسيق XML بديل
للنص العادي:
text/plain- محتوى نصي بسيطtext/html- محتوى HTML
كيف يحدث خطأ 415: شرح خطوة بخطوة
دعنا نمر بالضبط بما يحدث عند حدوث خطأ 415.
الخطوة 1: يرسل العميل طلبًا
يرسل تطبيق العميل طلبًا إلى نقطة نهاية واجهة برمجة تطبيقات الخادم. على سبيل المثال، لنفترض أننا نحاول إنشاء مستخدم جديد:
POST /api/users HTTP/1.1Host: api.example.comContent-Type: application/xmlContent-Length: 125
<user><name>John Doe</name><email>john@example.com</email></user>
الخطوة 2: يتحقق الخادم من Content-Type
يتلقى الخادم الطلب ويفحص رأس `Content-Type`. يرى `application/xml` ويتحقق من تكوينه لنقطة النهاية `/api/users`.
الخطوة 3: يدرك الخادم المشكلة
تم تكوين نقطة النهاية `/api/users` بالخادم لقبول `application/json` فقط. ليس لديه محلل XML معد لهذه النقطة، ولا يعرف كيفية التعامل مع البيانات الواردة.
الخطوة 4: استجابة 415
بدلاً من محاولة معالجة البيانات غير الصحيحة (مما قد يؤدي إلى أخطاء أو مشكلات أمنية)، يستجيب الخادم برمز الحالة `415 Unsupported Media Type`.
الخطوة 5: يتلقى العميل الخطأ
يتلقى تطبيق العميل استجابة `415` ويحتاج إلى التعامل معها بشكل مناسب عادةً عن طريق تصحيح رأس `Content-Type` وإعادة إرسال الطلب.
سيناريوهات شائعة قد تواجه فيها 415
1. تحميل الملفات في واجهات برمجة التطبيقات
إذا حاولت تحميل صورة باستخدام `application/json` بدلاً من `multipart/form-data`، فلن يفهم الخادم محتوى الملف.
2. واجهات برمجة تطبيقات مخصصة ذات تحقق صارم
ترفض واجهات برمجة التطبيقات ذات التحقق الصارم من المخطط أي طلب لا يتطابق مع قواعدها.
3. تطبيقات الهاتف المحمول التي تستخدم حزم تطوير برامج قديمة (SDKs)
في بعض الأحيان، ترسل حزم تطوير البرامج القديمة (SDKs) طلبات برؤوس قديمة، والتي لم تعد واجهات برمجة التطبيقات الحديثة تدعمها.
4. طلبات عبر المصادر (مشكلات CORS)
قد تقيد بعض تكوينات CORS أنواع المحتوى المقبولة، مما يتسبب بشكل غير مباشر في استجابة 415.
دور رأس Content-Type
يخبر رأس **Content-Type** في طلبات HTTP الخادم بنوع البيانات التي يرسلها العميل.
على سبيل المثال:
- **
application/json** لحمولات JSON. - **
text/xml** لبيانات XML. - **
multipart/form-data** لتحميل الملفات.
إذا كان هذا الرأس مفقودًا أو يشير إلى شيء لا يستطيع الخادم التعامل معه، فمن المحتمل أن ترى استجابة 415.
سيناريوهات واقعية تسبب أخطاء 415
السيناريو 1: رأس Content-Type مفقود
POST /api/users HTTP/1.1Host: api.example.com
{"name": "John Doe", "email": "john@example.com"}
سترفض العديد من الخوادم هذا لأنه لا يوجد رأس `Content-Type` يخبرهم بكيفية تفسير البيانات.
السيناريو 2: Content-Type خاطئ للبيانات
POST /api/users HTTP/1.1Host: api.example.comContent-Type: application/x-www-form-urlencoded
{"name": "John Doe", "email": "john@example.com"}
يقول الرأس إنها بيانات نموذج، لكن النص هو JSON. هذا عدم التطابق يربك الخادم.
السيناريو 3: الخادم لا يدعم التنسيق
POST /api/users HTTP/1.1Host: api.example.comContent-Type: application/xml
<user><name>John</name></user>
قد يدعم الخادم JSON فقط لنقطة النهاية هذه، حتى لو كان XML صحيح التكوين.
اختبار التعامل مع Content-Type باستخدام Apidog

دعنا نتحدث عن كيف يمكن لـ **Apidog** أن يجعل حياتك أسهل عند التعامل مع هذه الأخطاء. اختبار أنواع المحتوى المختلفة والتأكد من أن واجهة برمجة التطبيقات الخاصة بك تتعامل معها بشكل صحيح هو المكان الذي يتألق فيه Apidog. إنه يجعل من السهل بشكل لا يصدق اختبار هذه السيناريوهات دون كتابة تعليمات برمجية معقدة.
باستخدام Apidog، يمكنك:
- تعيين رؤوس Content-Type بسهولة: استخدم واجهة Apidog البديهية للاختيار من بين أنواع المحتوى الشائعة أو تحديد أنواع مخصصة.
- اختبار تنسيقات متعددة: اختبر بسرعة نفس نقطة النهاية بأنواع محتوى مختلفة (JSON، XML، بيانات النموذج) لمعرفة كيفية استجابة الخادم الخاص بك.
- التحقق من استجابات الأخطاء: تأكد من أن واجهة برمجة التطبيقات الخاصة بك تُرجع استجابات
415مناسبة مع رسائل خطأ مفيدة عند تلقي تنسيقات غير مدعومة. - اختبار الحالات القصوى: جرب أنواع محتوى غير صحيحة، أو رؤوس مفقودة، أو بيانات غير متطابقة للتأكد من أن واجهة برمجة التطبيقات الخاصة بك تتعامل معها بلباقة.
- أتمتة اختبار Content-Type: أنشئ مجموعات اختبار تتحقق تلقائيًا من أن واجهة برمجة التطبيقات الخاصة بك تقبل التنسيقات المدعومة بشكل صحيح وترفض التنسيقات غير المدعومة بشكل صحيح.
زر
على سبيل المثال، عندما تقوم بإعداد طلب POST في Apidog، فإنه يطبق تلقائيًا `Content-Type` الصحيح بناءً على نوع نص طلبك (JSON، XML، form-data، إلخ).
هذا يعني مفاجآت أقل ولا مزيد من أخطاء 415 التي تفسد جلسات الاختبار الخاصة بك. يمكن أن يوفر هذا الاختبار الاستباقي ساعات من تصحيح الأخطاء ويضمن أن واجهة برمجة التطبيقات الخاصة بك تتصرف بشكل متوقع.
415 مقابل أخطاء 4xx الأخرى: معرفة الفرق
من المهم التمييز بين `415` وأخطاء العميل الأخرى:
- **
400 Bad Request:** الطلب غير صحيح التكوين أو يحتوي على أخطاء نحوية، بغض النظر عن نوع المحتوى. - **
415 Unsupported Media Type:** الطلب صحيح التكوين، ولكن بتنسيق لا يدعمه الخادم لنقطة النهاية هذه. - **
406 Not Acceptable:** عكس `415` - لا يمكن للعميل قبول تنسيق الاستجابة الذي يريد الخادم إرساله.
أفضل الممارسات للتعامل مع أخطاء 415
لمستهلكي واجهة برمجة التطبيقات (مطورين العميل):
- **قم دائمًا بتعيين رأس Content-Type الصحيح** الذي يتطابق مع تنسيق نص طلبك.
- **تحقق من وثائق واجهة برمجة التطبيقات** لمعرفة أنواع الوسائط المدعومة لكل نقطة نهاية.
- **تعامل مع أخطاء 415 بلباقة** في التعليمات البرمجية الخاصة بك - لا تفترض أن الخادم سيقبل أي تنسيق ترسله.
- **وفر سلوكًا احتياطيًا** إن أمكن، مثل تحويل بياناتك إلى تنسيق مدعوم.
لمقدمي واجهة برمجة التطبيقات (مطورين الخادم):
- **كن صريحًا بشأن أنواع الوسائط المدعومة** في وثائق واجهة برمجة التطبيقات الخاصة بك.
- **أرجع رسائل خطأ مفيدة** تشير إلى أنواع الوسائط التي تدعمها.
- **فكر في دعم تنسيقات متعددة** إذا كان ذلك منطقيًا لواجهة برمجة التطبيقات الخاصة بك (على سبيل المثال، JSON و XML كلاهما).
- **استخدم رموز حالة HTTP المناسبة** - لا تستخدم
400عندما تقصد415.
مثال على استجابة 415 مصممة جيدًا:
HTTP/1.1 415 Unsupported Media TypeContent-Type: application/json
{
"error": "unsupported_media_type",
"message": "This endpoint only accepts application/json payloads.",
"supported_types": ["application/json"],
"documentation": "<https://api.example.com/docs/content-types>"
}
أخطاء Content-Type الشائعة التي تسبب 415
فيما يلي بعض الأخطاء الشائعة التي يقع فيها المطورون كثيرًا:
| الخطأ | الوصف | مثال |
|---|---|---|
| استخدام اسم رأس خاطئ | خطأ مطبعي أو مشكلة في حالة الأحرف | contenttype بدلاً من Content-Type |
| إرسال بيانات نموذج بدلاً من JSON | الخادم يتوقع JSON فقط | application/x-www-form-urlencoded |
| نسيان ترميز الأحرف (charset) | معلومات ترميز مفقودة | application/json; charset=utf-8 |
| إرسال نص فارغ | حمولة مطلوبة مفقودة | POST /api بدون بيانات |
| استخدام أنواع ملفات غير مدعومة | تنسيق تحميل خاطئ | تحميل .exe بدلاً من .png |
تبدو هذه صغيرة ولكنها يمكن أن تسبب أعطالًا كبيرة في الطلبات.
إصلاحات شائعة لأخطاء 415
إذا كنت تواجه خطأ 415، فإليك الحلول الأكثر شيوعًا:
أضف رأس Content-Type المفقود:
POST /api/users HTTP/1.1Content-Type: application/json
صحح رأس Content-Type:
# قبل (خطأ):
Content-Type: text/plain
# بعد (صحيح):
Content-Type: application/json
حوّل بياناتك إلى تنسيق مدعوم:
إذا كان الخادم يقبل JSON فقط، فتأكد من أنك ترسل JSON صحيحًا، وليس XML أو بيانات نموذج.
تحقق من الأخطاء المطبعية:
# خطأ:
Content-Type: application/jason
# صحيح:
Content-Type: application/json
اعتبارات متقدمة
تفاوض المحتوى
تدعم بعض واجهات برمجة التطبيقات المتطورة تفاوض المحتوى، حيث يمكن للعميل تحديد التنسيقات التي يمكنه قبولها باستخدام رأس `Accept`:
GET /api/users/123 HTTP/1.1Accept: application/json, application/xml;q=0.9
يخبر هذا الخادم: "أفضل JSON، ولكن يمكنني قبول XML إذا لزم الأمر."
معامل Charset
بالنسبة للتنسيقات النصية، قد تحتاج إلى تحديد ترميز الأحرف:
Content-Type: application/json; charset=utf-8
الخاتمة: أهمية التواصل الواضح
يسلط رمز حالة HTTP `415 Unsupported Media Type` الضوء على جانب أساسي من اتصالات الويب: يجب أن يتفق الطرفان على "اللغة" التي يستخدمانها لتبادل البيانات. لا يكفي إرسال البيانات الصحيحة، بل يجب إرسالها بالتنسيق الصحيح والإعلان بشكل صحيح عن ماهية هذا التنسيق.
يُعد HTTP 415 Unsupported Media Type جزءًا أساسيًا لضمان أن الخوادم تعالج فقط تنسيقات البيانات المتوقعة والمتوافقة. التعامل الصحيح مع رؤوس Content-Type، واتباع مواصفات واجهة برمجة التطبيقات، والاختبار باستخدام أدوات مثل Apidog يمكن أن يقلل هذه الأخطاء بشكل كبير.
فهم أخطاء `415` والتعامل معها بشكل صحيح سيجعلك مستهلكًا لواجهة برمجة التطبيقات أكثر فعالية ومصممًا أفضل لواجهة برمجة التطبيقات. من خلال الاهتمام بأنواع المحتوى وتوفير اتصال واضح بين العملاء والخوادم، يمكنك تجنب هذه الأخطاء المحبطة وبناء تكاملات أكثر قوة. تذكر أن واجهات برمجة التطبيقات تزدهر بالاتصال الواضح بين العميل والخادم. إذا كانوا يتحدثون نفس "اللغة" (في هذه الحالة، نوع الوسائط)، فكل شيء يسير بسلاسة.
لذا في المرة القادمة التي تواجه فيها خطأ `415`، تذكر أنه ليس فشلًا معقدًا في الخادم - إنه مشكلة اتصال بسيطة يسهل إصلاحها عادةً. وعندما تقوم ببناء أو اختبار واجهات برمجة التطبيقات، فإن استخدام أداة مثل Apidog سيساعدك على ضمان أن أنواع المحتوى الخاصة بك صحيحة دائمًا، مما يمنع حدوث هذه الأخطاء قبل وقوعها.
زر
