متغيرات المسار ومعاملات الطلب
متغيرات المسار ومعاملات الطلب
تحتاج كل واجهة برمجية REST إلى طريقة تُمكّن المستدعين من تحديد أي مورد يريدون وكيف يريدون تصفيته أو تشكيله. تمنحك Spring MVC آليتين واضحتين لذلك: متغيرات المسار (مقاطع مُضمَّنة في URI نفسه) ومعاملات الطلب (أزواج مفتاح-قيمة في سلسلة الاستعلام). معرفة متى تستخدم كلًّا منهما — وكيف تستخدم الاثنتين بشكل صحيح — هو أساس تصميم واجهة REST متقنة.
متغيرات المسار مع @PathVariable
متغير المسار هو عنصر نائب مُسمَّى داخل قالب URL، يُحاط بأقواس معقوصة. عند وصول طلب، تستخرج Spring القيمة الفعلية عند ذلك الموضع وتحقنها في معامل الدالة المُزيَّن بـ @PathVariable.
افتراضيًا يجب أن يتطابق اسم المتغير في القالب مع اسم المعامل. إن اختلفا (مثلًا في كود مُترجَم يُزيل أسماء المعاملات) مرِّر الاسم صراحةً: @PathVariable("id") Long productId.
متغيرات مسار متعددة
يمكنك امتلاك أكبر عدد من مقاطع المسار بحسب ما تتطلبه التسلسلية الهرمية للموارد. نمط شائع هو المورد المتداخل: طلب ينتمي إلى عميل محدد.
/products/42 يُسمّي موردًا واحدًا بلا غموض. لهذا تستخدم واجهات REST البرمجية متغيرات المسار للمعرّفات ومفاتيح البحث الأولية.
متغيرات المسار الاختيارية
يمكنك جعل متغير المسار اختياريًا بتعيين required = false وإقرانه بـ java.util.Optional أو بمعامل يقبل القيم الفارغة. هذا نادر عمليًا لمقاطع المسار — فإن كان المقطع قد يغيب، فالتعيين المنفصل عادةً أوضح — لكنه صياغة صحيحة.
معاملات الطلب مع @RequestParam
تقع معاملات الطلب في سلسلة الاستعلام: ?page=2&size=20&sort=name. تناسب المرشّحات الاختيارية والترقيم والترتيب والبحث — أي شيء يُضيِّق أو يُشكِّل مجموعة النتائج بدلًا من تحديد مورد بعينه.
السمات الأساسية لـ @RequestParam:
required— افتراضيًاtrue؛ تُعيد Spring 400 إن غاب المعامل ولم تُقدِّم قيمة افتراضية.defaultValue— سلسلة تُحوَّل نوعيًا إلى نوع المعامل؛ تُضمِّنrequired = falseضمنيًا.name(أوvalue) — استخدمها حين يختلف مفتاح سلسلة الاستعلام عن اسم معامل Java.
defaultValue لمعاملات الترقيم. المستدعي الذي يُغفل page أو size سيحصل وإلا على خطأ 400. الإعداد الافتراضي عند الصفحة 0 وحجم معقول (10–25) هو الاتفاقية المعيارية في واجهات REST.
معاملات متعددة القيم
يمكن لسلسلة الاستعلام أن تحمل المفتاح نفسه أكثر من مرة: ?tag=java&tag=spring. اربطها بـ List وستجمع Spring جميع القيم تلقائيًا.
تحويل الأنواع
تُحوِّل ConversionService في Spring القيمة النصية الخام إلى نوع المعامل المُعلَن تلقائيًا. الأنواع البدائية (int، long، boolean) والأنواع المُغلَّفة وUUID وLocalDate والتعدادات (enums) كلها تعمل جاهزة. عند فشل التحويل تُعيد Spring 400 Bad Request برسالة وصفية — ولست بحاجة لكتابة كود تحليل بنفسك.
@RequestParam @Size(max=100) String q) أو في طبقة الخدمة — قبل تمرير القيم إلى كود الاستمرارية.
متغير المسار مقابل معامل الطلب — قاعدة التصميم
قاعدة عملية يعتمدها مصممو واجهات REST المتمرّسون:
- استخدم متغير المسار حين تُحدّد القيمة موردًا بشكل فريد أو مستوىً محددًا في التسلسل الهرمي:
/users/99،/users/99/posts/12. - استخدم معامل الطلب حين تُصفّي القيمة أو تُرتِّب أو تُرقِّم أو تعدّل الاستجابة بأي شكل دون تغيير مجموعة الموارد المُعالَجة:
/users?role=admin&page=2.
يتوافق هذا بدقة مع دلالات REST: المسار يُسمّي المورد؛ وسلسلة الاستعلام تُشكّل التمثيل.
الجمع بين الاثنين — نقطة نهاية واقعية
تُفصل هذه الدالة بوضوح بين الهوية (productId في المسار) والتصفية (rating) والترقيم (page، size) — وهو النمط ذاته الذي ستجده في واجهات REST الناضجة كـ GitHub وStripe وTwitter/X API.
الخلاصة
استخدم @PathVariable للقيم التي تُحدّد موردًا في التسلسل الهرمي لـ URI، و@RequestParam للقيم الاختيارية في سلسلة الاستعلام التي تُصفّي الاستجابة أو تُشكّلها. كلتاهما تدعمان تحويل الأنواع تلقائيًا. حدِّد دائمًا defaultValue للمعاملات الاختيارية لتجنّب استجابات 400 غير متوقعة وجعل واجهتك البرمجية أكثر تسامحًا مع المستدعين.