أنت تحاول استئناف تنزيل ملف كبير توقف. يعرف مدير التنزيلات لديك أنه يمتلك بالفعل أول 50 ميجابايت ويطلب بذكاء من الخادم "كل شيء بدءًا من البايت رقم 50,000,000 فصاعدًا". ولكن بدلاً من الحصول على البيانات المتبقية، تتلقى خطأً. يقول الخادم: "لا يمكنني تلبية هذا الطلب لأن ما تطلبه خارج نطاقي".
يتم التعامل مع هذا السيناريو المحدد بواسطة أحد رموز الخطأ الأكثر دقة في HTTP: 416 Range Not Satisfiable.
رمز الحالة هذا هو النظير الأقل شهرة للاستجابة الناجحة 206 Partial Content. بينما تقول 206 "إليك الجزء الذي طلبته"، تقول 416 "لا يمكنني أن أعطيك الجزء الذي طلبته لأن حساباتك خاطئة".
إنه المكافئ الرقمي لطلب من أمين مكتبة "الصفحات 500-600" من كتاب مكون من 400 صفحة. الطلب مفهوم تمامًا، ولكنه يطلب شيئًا غير موجود.
إذا كنت تعمل مع تنزيلات الملفات، أو بث الفيديو، أو واجهات برمجة التطبيقات التي تتعامل مع عمليات نقل البيانات الكبيرة، فإن فهم رمز الحالة 416 أمر أساسي لبناء تطبيقات قوية.
في منشور المدونة الشامل هذا، سنستكشف معنى رمز الحالة 416 Range Not Satisfiable، والسيناريوهات الشائعة التي يظهر فيها، ولماذا يهم، وكيف يمكن للمطورين والمستخدمين على حد سواء التعامل معه أو منعه. سنناقش أيضًا كيفية استخدام أدوات مثل Apidog لاختبار وتصحيح استجابات HTTP التي تتضمن 416 وجعل واجهات برمجة التطبيقات الخاصة بك أكثر قوة.
Range والتحقق من أن خادمك يتعامل مع كل من استجابات 206 و 416 بشكل صحيح.الآن، دعنا نستكشف عالم نطاقات البايت ورمز حالة HTTP 416 Range Not Satisfiable.
الأساس: طلبات نطاق HTTP
لفهم 416، نحتاج أولاً إلى فهم الميزة التي يدعمها: طلبات نطاق HTTP.
طلبات النطاق هي تحسين للأداء يسمح للعملاء بطلب أجزاء محددة فقط من المورد. هذا مفيد بشكل لا يصدق لـ:
- استئناف التنزيلات: إذا توقف التنزيل، يمكن للعميل طلب الأجزاء المفقودة فقط بدلاً من البدء من جديد.
- بث الفيديو: يمكن لمشغلات الفيديو الانتقال إلى أي نقطة في الفيديو عن طريق طلب نطاق البايت المقابل.
- التنزيلات المتوازية: يمكن لمديري التنزيلات تقسيم الملف إلى أجزاء وتنزيلها في وقت واحد.
- نقل البيانات بكفاءة: عندما تحتاج فقط إلى جزء من ملف كبير أو مجموعة بيانات.
يبدأ العميل طلب نطاق عن طريق تضمين رأس Range في طلبه. على سبيل المثال:
GET /large-file.zip HTTP/1.1Host: example.comRange: bytes=50000000-
يقول هذا الطلب: "الرجاء إرسال جميع البايتات بدءًا من الموضع 50,000,000 إلى نهاية الملف."
ماذا يعني HTTP 416 Range Not Satisfiable بالفعل؟
يشير رمز الحالة 416 Range Not Satisfiable إلى أن الخادم لا يمكنه تقديم النطاقات المطلوبة. يحدث هذا عندما لا تتداخل النطاق أو النطاقات المحددة في حقل رأس Range للطلب مع الامتداد الحالي للمورد المحدد.
بشكل أبسط: "لقد طلبت جزءًا من الملف غير موجود."
يجب أن تتضمن استجابة 416 المناسبة رأس Content-Range يشير إلى الحجم الفعلي للمورد المحدد. يساعد هذا العميل على فهم النطاقات المتاحة بالفعل.
تبدو استجابة 416 القياسية كما يلي:
HTTP/1.1 416 Range Not SatisfiableContent-Range: bytes */50000000Content-Type: text/htmlContent-Length: 147
<html><head><title>416 Range Not Satisfiable</title></head><body><center><h1>416 Range Not Satisfiable</h1></center></body></html>
الجزء الحاسم هو رأس Content-Range: bytes */50000000. هذا يخبر العميل:
bytes: الوحدة المستخدمة- : النطاق الحالي غير محدد (لأن الطلب غير صالح)
50000000: الطول الإجمالي للمورد بالبايت
بمعنى آخر:
يقول العميل: "أعطني البايتات X إلى Y"، لكن هذه البايتات غير موجودة في المورد.
هذا شائع عندما يحاول العملاء استئناف التنزيلات من مواضع غير صحيحة أو طلب نطاقات بايت لا تتوافق مع الطول الفعلي للمورد.
لماذا يعد فهم 416 مهمًا
قد تعتقد أن "416 يبدو نادرًا؛ هل أحتاج حقًا إلى الاهتمام به؟" الإجابة هي نعم، خاصة في الأنظمة القوية التي تتميز بالمرونة أو البث أو دعم الاستئناف. إليك السبب:
- تجربة المستخدم: يمكن أن يؤدي فشل جزء أو البحث عن الفيديو إلى كسر التشغيل السلس أو التنزيلات.
- استعادة الأخطاء: التعامل الصحيح مع 416 يضمن أن تطبيقك يمكنه العودة إلى الوضع السابق أو تصحيح نفسه.
- وضوح التصحيح: بدلاً من رسائل "فشل التنزيل" الغامضة، معرفة أن "النطاق غير قابل للتحقيق" دقيق.
- قابلية التشغيل البيني: إذا تم بناء عملائك وخوادمك بواسطة فرق مختلفة، فإن التعامل الواضح مع منطق النطاق يتجنب أخطاء التكامل.
- الأداء: تجنب طلبات النطاق غير الصالحة يقلل من حركة مرور الشبكة المهدرة وحمل الخادم.
باختصار، لبناء أنظمة مرنة تتعامل مع الحالات الهامشية، فإن فهم HTTP 416 ضروري.
لماذا تُستخدم طلبات النطاق؟
تسمح طلبات النطاق للعملاء بطلب أجزاء محددة من المورد بدلاً من الملف بأكمله. هذا مفيد لعدة أسباب:
- تنزيلات فعالة: استئناف التنزيلات المتقطعة دون البدء من الصفر.
- تدفق الوسائط: استرداد أجزاء من مقاطع الفيديو أو الملفات الصوتية عند الطلب.
- تحسينات التخزين المؤقت: يقوم العملاء بجلب أجزاء المحتوى الجديدة أو المتغيرة فقط.
- توفير النطاق الترددي: تجنب تنزيلات الحمولة الكاملة.
تعتمد هذه الطلبات الجزئية على رأس HTTP Range الذي يحدد نطاقات البايت.
كيف يحدث خطأ 416 Range Not Satisfiable؟
يحدث 416 عندما:
- النطاق المطلوب يقع بالكامل خارج الحجم الحالي للمورد (على سبيل المثال، طلب البايتات من 1,000,000 إلى 1,000,100 بينما حجم الملف 500,000 بايت فقط).
- رأس النطاق مشوه أو يحدد نطاقات غير صالحة.
- تم تعديل المورد وتقليصه، مما يجعل نطاق العميل المخزن غير صالح.
- لا يستطيع الخادم أو لن يقوم بمعالجة الطلب الجزئي لأسباب داخلية أخرى.
في مثل هذه الحالات، يستجيب الخادم بـ 416، لإعلام العميل بأنه لا يمكن تقديم النطاق المطلوب.
السيناريوهات الشائعة التي تؤدي إلى أخطاء 416
دعنا نلقي نظرة على أكثر المواقف شيوعًا التي قد تواجه فيها استجابة 416.
السيناريو 1: طلب بايتات تتجاوز حجم الملف
هذه هي الحالة الأكثر وضوحًا. يطلب العميل نطاقًا يمتد إلى ما بعد الحجم الفعلي للملف.
الطلب:
GET /document.pdf HTTP/1.1Host: example.comRange: bytes=5000000-6000000
المشكلة: حجم ملف document.pdf هو 4,000,000 بايت فقط (حوالي 4 ميجابايت) إجمالاً.
استجابة الخادم 416:
HTTP/1.1 416 Range Not SatisfiableContent-Range: bytes */4000000
يقول الخادم: "لقد طلبت البايتات من 5,000,000 إلى 6,000,000، ولكن حجم الملف الإجمالي هو 4,000,000 بايت فقط. طلبك لا معنى له."
السيناريو 2: تغير حجم الملف
يحدث هذا غالبًا عند استئناف التنزيلات. تخيل أنك تبدأ بتنزيل ملف بحجم 100 ميجابايت، ولكنه يتوقف عند 50 ميجابايت. في هذه الأثناء، يتم تحديث الملف على الخادم ويصبح حجمه الإجمالي 80 ميجابايت فقط.
طلب استئناف العميل:
GET /software-update.zip HTTP/1.1Host: example.comRange: bytes=50000000-
المشكلة: أصبح حجم الملف الآن 80,000,000 بايت فقط، لكنك تطلب كل شيء بدءًا من البايت 50,000,000 فصاعدًا، والذي سيمتد إلى 80,000,000+.
استجابة الخادم 416:
HTTP/1.1 416 Range Not SatisfiableContent-Range: bytes */80000000
يخبرك الخادم: "لقد تغير الملف. حجمه الإجمالي الآن 80 ميجابايت فقط، لذا فإن طلبك للبيانات بدءًا من 50 ميجابايت لم يعد يتوافق مع الواقع."
السيناريو 3: صيغة نطاق غير صالحة
بينما قد تعيد الخوادم 400 Bad Request للنطاقات غير الصالحة نحويًا، قد يستخدم البعض 416 إذا كانت قيم النطاق مستحيلة رقميًا.
الطلب:
GET /data.bin HTTP/1.1Host: example.comRange: bytes=1000-500
المشكلة: بايت البداية (1000) يأتي بعد بايت النهاية (500)، وهو أمر مستحيل رياضيًا.
كيفية اكتشاف 416 في تطبيقاتك
للتعامل بفعالية مع أخطاء 416 أو تجنبها، تحتاج إلى أن تكون قادرًا على اكتشافها برمجيًا أو أثناء التصحيح. إليك بعض النصائح:
- تحقق من رموز حالة HTTP: إذا حصل عميلك على
status === 416(أو في مكتبة، رمز الخطأ 416)، تعامل معه بشكل خاص. - افحص الرؤوس: انظر إلى رأس
Content-Range. إذا كانbytes */N، فأنت تعلم أن الطول الصالح هوN. - منطق التراجع: إذا حدث 416، فربما تحتاج إلى إعادة جلب المورد بأكمله (أي بدون
Range). أو اضبط إزاحاتك. - معلومات التسجيل / التصحيح: سجل النطاق الذي تم محاولته والحدود الصالحة التي تم إرجاعها لفهم مدى الخطأ في المنطق.
- استخدم الأدوات (Apidog!): باستخدام أداة اختبار REST/API مثل Apidog، يمكنك صياغة الطلبات يدويًا باستخدام رؤوس
Range، ورؤية الاستجابة الكاملة (الرؤوس + الجسم)، والتكرار حتى تحصل على النتيجة الصحيحة.
أمثلة واقعية وحالات استخدام
دعنا نفحص بعض السياقات العملية التي قد يظهر فيها 416.
بث الفيديو وخوادم الوسائط
غالبًا ما تطلب مشغلات الفيديو محتوى جزئيًا، على سبيل المثال "بدء التشغيل من 10 دقائق" باستخدام نطاقات البايت. إذا كان ملف الفيديو أقصر (أو كان جزء غير متاح)، فقد يطلب العميل نطاقًا يتجاوز البيانات الفعلية، مما يتسبب في 416.
في إعدادات البث هذه، من الأهمية بمكان التأكد من أن خادم الوسائط الخاص بك يعلن عن الطول بشكل صحيح ويتعامل مع النطاقات غير الصالحة بلباقة.
مديرو التنزيلات القابلة للاستئناف
غالبًا ما يقوم مديرو التنزيلات بتقسيم الملفات إلى أجزاء (على سبيل المثال، 0-1 ميجابايت، ثم 1 ميجابايت-2 ميجابايت، وما إلى ذلك). إذا كان نطاق الجزء الأخير خارج الحدود (بسبب التقريب، أو تغييرات الملفات، وما إلى ذلك)، فقد يعيد طلب هذا الجزء 416.
مدير تنزيلات قوي:
- يتحقق من حجم الجزء الأخير بعناية.
- يتعامل مع 416 عن طريق إعادة المحاولة أو إعادة توازن إزاحات الأجزاء.
- يسجل أو ينبه المستخدمين إذا حدثت إخفاقات متكررة في الأجزاء.
واجهات برمجة التطبيقات التي تعيد نطاقات البيانات
تدعم بعض واجهات برمجة التطبيقات استرداد البيانات الجزئي عن طريق النطاقات، على سبيل المثال، السجلات أو الملفات النصية الكبيرة أو الكتل الثنائية. إذا طلب العميل Range: bytes=… خارج الحدود، أو عندما يكون المورد أصغر، فستواجه 416.
في مثل هذه واجهات برمجة التطبيقات، يجب أن تتناسق الوثائق والعملاء. يجب أن تحدد واجهة برمجة التطبيقات بوضوح كيفية عمل الاسترداد الجزئي، ويجب على العملاء توخي الحذر للتحقق من الصحة قبل الطلب.
416 مقابل أخطاء العميل الأخرى: معرفة الفرق
من المهم التمييز بين 416 ورموز حالة 4xx الأخرى.
1. 416 Range Not Satisfiable مقابل 400 Bad Request:
416يعني "طلب النطاق الخاص بك صحيح نحويًا ولكنه غير صالح دلاليًا لهذا المورد المحدد."400يعني "لا يمكنني حتى فهم طلبك" بسبب صيغة مشوهة عامة.
2. 416 Range Not Satisfiable مقابل 404 Not Found:
416يعني "المورد موجود، لكن النطاق الذي طلبته غير موجود."404يعني "المورد نفسه غير موجود."
3. 416 Range Not Satisfiable مقابل 206 Partial Content:
206هي الاستجابة الناجحة لطلب نطاق صالح.416هي استجابة الخطأ لطلب نطاق غير صالح.
كيف يمكن للمطورين منع أخطاء 416؟
يمكن للمطورين ومسؤولي الخوادم اتخاذ تدابير مثل:
- ضمان دقة رؤوس
Content-Lengthفي استجابات الموارد. - التحقق من صحة رؤوس النطاق وتحليلها بقوة.
- إرجاع رؤوس
Content-Rangeالمناسبة في الاستجابات الجزئية. - التعامل مع تعديلات الموارد بأمان لإبطال نطاقات العميل القديمة.
- استخدام وثائق API لتوجيه العملاء بشأن طلبات النطاق المدعومة.
- اختبار معالجة المحتوى الجزئي على نطاق واسع باستخدام أدوات مثل Apidog.
اختبار طلبات النطاق واستجابات 416 باستخدام Apidog

يعد اختبار سلوك طلب النطاق أمرًا بالغ الأهمية للتطبيقات التي تتعامل مع نقل الملفات. يوفر Apidog أدوات ممتازة لهذا الغرض.
باستخدام Apidog، يمكنك:
- صياغة طلبات نطاق دقيقة: أضف رؤوس
Rangeبسهولة إلى طلباتك بنطاقات بايت محددة. - اختبار النطاقات الصالحة: تحقق من أن طلبات النطاق المشروعة تعيد
206 Partial Contentمع رأسContent-Rangeالصحيح. - اختبار الحالات الهامشية: أرسل طلبات نطاق غير صالحة عمدًا للتأكد من أن خادمك يعيد استجابات
416الصحيحة:
- طلب نطاقات تتجاوز حجم الملف
- الاختبار بنطاقات معكوسة (النهاية قبل البداية)
- استخدام نطاقات سلبية بشكل غير صحيح
4. فحص الرؤوس: استخدم عرض الاستجابة المفصل في Apidog للتحقق من أن استجابات 416 تتضمن رأس Content-Range: bytes */{total_length} المطلوب.
5. أتمتة الاختبار: أنشئ مجموعات اختبار تتحقق تلقائيًا من معالجة خادمك لطلبات النطاق في سيناريوهات مختلفة.
يضمن هذا الاختبار أن مديري التنزيلات ومشغلات الفيديو والعملاء الآخرين الذين يدركون النطاق سيتصرفون بشكل صحيح عندما يواجهون حالات هامشية.

من خلال القيام بذلك بشكل تفاعلي، يمكنك تشخيص بالضبط أين يفشل منطق النطاق الخاص بك. تساعدك واجهة Apidog على رؤية كل شيء: الرؤوس، الجسم، التوقيت، مما يجعل تصحيح أخطاء 416 أسهل بكثير من التخمين عبر الكود وحده.
إذا لم تكن قد استخدمت Apidog من قبل، فهذا هو الوقت المناسب لتجربته. قم بتنزيله مجانًا، وحمّل نقطة نهاية واجهة برمجة التطبيقات الخاصة بك، وابدأ الاختبار بمجموعات مختلفة من رؤوس Range. ستحصل على ملاحظات فورية، وهذا بالضبط ما تريده عند التعامل مع أخطاء يصعب إعادة إنتاجها مثل 416.
كيف يجب على العملاء التعامل مع استجابات 416
يجب أن يعرف العميل الجيد السلوك كيفية التعافي من خطأ 416. إليك ما تفعله التطبيقات الذكية:
- تحليل رأس
Content-Range: استخرج الطول الإجمالي للمورد من رأسContent-Range: bytes */{total_length}. - إعادة ضبط فهمهم: تجاهل أي محتوى تم تنزيله مسبقًا إذا تغير الحجم الإجمالي.
- إعادة تشغيل التنزيل: ابدأ تنزيلًا جديدًا من البداية (
Range: bytes=0-) أو أعد حساب النطاقات الصالحة بناءً على الحجم الإجمالي الجديد. - إبلاغ المستخدم: إذا كان ذلك مناسبًا، أبلغ المستخدم بأن الملف قد تغير ويجب إعادة تشغيل التنزيل.
مثال على منطق العميل:
// Pseudo-code for handling a 416 response
if (response.status === 416) {
// Extract total file size from Content-Range header
const totalSize = extractTotalSize(response.headers['Content-Range']);
// If we thought the file was a different size, we need to start over
if (totalSize !== this.expectedFileSize) {
this.downloadedBytes = 0;
this.expectedFileSize = totalSize;
this.restartDownload();
}
}
أفضل الممارسات والنصائح عند العمل مع طلبات نطاق HTTP
إليك قائمة بالنصائح السريعة وأفضل الممارسات لمساعدتك في تجنب أو التعامل مع أخطاء 416 بشكل أكثر أناقة في أنظمة العالم الحقيقي:
- احصل دائمًا على الحجم الإجمالي أولاً: استخدم
HEADأو نقطة نهاية بيانات تعريف للحصول علىContent-Lengthأو حجم الملف. - تجنب النطاقات "المفتوحة" عندما يكون ذلك ممكنًا: بدلاً من
bytes=1000-، احسب الحد النهائي الفعلي واستخدمbytes=1000-<end>. - احمِ منطق الأجزاء الخاص بك: عند تقسيم الأجزاء، تأكد من أن الجزء الأخير لا يتجاوز الحد.
- نفذ التراجع عند 416: إذا تلقيت 416، فارجع إلى GET الكامل أو جزء أصغر آمن.
- إبطال التخزين المؤقت عند تغيير الموارد: حتى لا يستخدم العملاء أحجامًا إجمالية قديمة.
- إرجاع بيانات تعريف خطأ مفيدة: تضمين
Content-Range، رسالة الخطأ، تلميحات في الجسم للعملاء. - تحديد معدل أو رفض النطاقات السخيفة مبكرًا: على جانب الخادم، قم بإجراء فحوصات السلامة (على سبيل المثال، "يجب أن تكون البداية < النهاية"، "النهاية < الحد الأقصى"). أعد 400 أو 416 مبكرًا إذا كانت غير صالحة.
- دعم رأس "accept-ranges": في GET الناجح، قم بتضمين
Accept-Ranges: bytesللإشارة إلى الدعم. - وثق سلوك النطاق الخاص بك: في وثائق واجهة برمجة التطبيقات الخاصة بك، اشرح كيفية عمل طلبات النطاق، بما في ذلك الحدود وسلوك التراجع.
- استخدم الأدوات للاختبار بدقة: يدويًا أو عبر الاختبارات الآلية، قم بتغطية الحالات الهامشية مثل النطاقات ذات الطول الصفري، والإزاحات السلبية، وما إلى ذلك.
سجل أخطاء النطاق في الإنتاج: حتى تتمكن من رؤية الأنماط، ربما يواجه العديد من العملاء 416، مما يكشف عن خطأ في منطقهم.
المفاهيم الخاطئة الشائعة والمزالق
من السهل أن تقع في فخ سوء الفهم الصغير عند التعامل مع 416. إليك بعض الأمور التي يجب الانتباه إليها:
- "416 يحدث فقط في التنزيلات": ليس صحيحًا. أي استرداد جزئي (مثل كتل API) يمكن أن يؤدي إلى ذلك.
- "416 هو خطأ في الخادم": ليس دائمًا. يمكن أن يكون منطقًا من جانب العميل يختار حدود النطاق بشكل غير صحيح.
- "416 يعني أن الخادم معطل": غالبًا لا، إنه العميل يطلب نطاقًا غير موجود.
- "لا تستخدم رؤوس Range لتجنب 416": هذا آمن ولكنك تفقد تحسينات الجلب الجزئي/الاستئناف.
- "استجابات 416 لا تحتوي أبدًا على جسم": تتضمن بعض الخوادم رسالة خطأ أو جسم JSON لتوفير المزيد من السياق.
- "416 = لم يتم العثور على الملف": لا، لعدم العثور على الملف سترى 404، وليس 416.
من خلال إدراك هذه الأمور، يمكنك تجنب التشخيص الخاطئ.
لماذا يهم هذا لأنظمة API والتنزيل
من خلال التعامل مع أخطاء 416 كسيناريو من الدرجة الأولى، يمكنك بناء أنظمة أكثر مرونة. بعض الفوائد المحددة:
- تجربة مستخدم أفضل: عدد أقل من التنزيلات المعطلة أو عمليات البحث عن الوسائط
- استعادة أقوى للأخطاء: يمكن لتطبيقك التكيف تلقائيًا عندما تفشل النطاقات
- تشخيصات واضحة: تساعدك السجلات والبيانات الوصفية على تحديد المشكلات بدقة
- عملاء خوادم قابلة للتشغيل البيني: سلوك النطاق المحدد جيدًا يقلل من احتكاك التكامل
- أداء محسّن: لا توجد طلبات أو وقت مهدر بسبب التجاوزات العمياء
تذكر: في الأنظمة المتصلة بالشبكة، تعد الحالات الهامشية (الملفات المقتطعة، ذاكرة التخزين المؤقت القديمة، عمليات إعادة المحاولة الجزئية) هي المكان الذي تعيش فيه العديد من الأخطاء. معرفة كيفية "الرقص بأمان" حول 416 هو علامة على نضج واجهة برمجة التطبيقات.
الخاتمة: حارس حدود البايت
يلعب رمز حالة HTTP 416 Range Not Satisfiable دورًا حاسمًا في نظام نقل الملفات الفعال. إنه ليس خطأً شائعًا لمعظم المستخدمين، ولكنه ضروري للتشغيل القوي لمديري التنزيلات وخدمات بث الفيديو والتطبيقات الأخرى التي تستخدم طلبات المحتوى الجزئي.
يساعد فهم 416 المطورين على بناء تطبيقات أكثر مرونة يمكنها التعامل مع تعقيدات العالم الحقيقي لعمليات نقل الشبكة وتغييرات الملفات وعمليات الاستئناف. إنها طريقة البروتوكول للحفاظ على سلامة البيانات وضمان عدم تؤدي طلبات النطاق إلى تنزيلات تالفة أو عملاء مرتبكين.
لذا في المرة القادمة التي تقوم فيها ببناء تطبيق يتعامل مع ملفات كبيرة، تذكر أن تتعامل مع حالة النجاح 206 وحالة الخطأ 416 بلباقة. وعندما تحتاج إلى اختبار هذه السيناريوهات، ستمنحك أداة قوية مثل Apidog الدقة والتحكم اللازمين لضمان أن معالجة طلب النطاق الخاص بك محصنة.
ومرة أخرى لا تنسَ: قم بتنزيل Apidog مجانًا، وقم بتشغيل نقطة النهاية الخاصة بك، وجرب بعض طلبات Range. راقب كيف يستجيب الخادم واختبر الحالات الهامشية التي ناقشناها. إنه تعلم عملي يعزز هذه المعرفة.
ترميز سعيد وليكن جلبك الجزئي دائمًا ضمن الحدود.
