API بلغة Java: REST، GraphQL، gRPC — أيهما تختار في 2025؟

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: تطور API في Java

\n\n

عالم تطوير Java لا يقف ساكنًا. قبل 10 سنوات كان الاختيار واضحًا: REST و JSON. أما اليوم، فعند تصميم بنية الخدمات المصغرة أو تطبيق جوال، يواجه المطور مجموعة كاملة من البروتوكولات. REST، GraphQL، gRPC — كل منها يعد بجنان، لكن في الواقع، كل تقنية تحمل تنازلاتها.

\n\n

في هذه المقالة، لن نعيد سرد الوثائق. سنأخذ مهمة حية: نحتاج إلى إنشاء API لمنصة تعليمية (مثل PythonLib لدينا، ولكن بلغة Java). لدينا دورات وطلاب وتقدم تعليمي. وسنحاول تنفيذ نفس الـ endpoint بثلاث طرق مختلفة.

\n\n

لننطلق لمعرفة أي بروتوكول سيجعل كودك أسرع وحياتك أسهل.

\n\n

REST API بلغة Java: الكلاسيكية التي لا تموت

\n\n

REST (نقل الحالة التمثيلية) هو أسلوب معماري وليس بروتوكولًا. في Java، أصبح المعيار الفعلي لـ REST هو Spring Boot مع تعليقاته التوضيحية. البساطة، الوضوح، المجتمع الضخم — هذا ما نحب REST لأجله.

\n\n

مثال: الحصول على قائمة الدورات

\n\n

لنفترض أننا بحاجة إلى إرجاع قائمة بجميع الدورات مع المعلومات الأساسية للعميل:

\n\n
@RestController\n@RequestMapping("/api/courses")\npublic class CourseController {\n\n    @GetMapping\n    public ResponseEntity<List<CourseDTO>> getAllCourses() {\n        List<Course> courses = courseService.findAll();\n        List<CourseDTO> dtos = courses.stream()\n                .map(c -> new CourseDTO(c.getId(), c.getTitle(), c.getAuthor()))\n                .toList();\n        return ResponseEntity.ok(dtos);\n    }\n}
\n\n

يتلقى العميل JSON:

\n\n
[\n  {"id": 1, "title": "Java للمبتدئين", "author": "إيفان بيتروف"},\n  {"id": 2, "title": "Spring Boot Masterclass", "author": "آنا سميرنوفا"}\n]
\n\n

مزايا REST بلغة Java:

\n
    \n
  • حد أدنى من الدخول — أي مطور Java يعرف Spring.
  • \n
  • التخزين المؤقت عبر رؤوس HTTP (ETag، Cache-Control).
  • \n
  • دعم واسع للأدوات (Postman، Swagger، OpenAPI).
  • \n
\n\n

العيوب:

\n
    \n
  • مشكلة over-fetching (بيانات زائدة) و under-fetching (بيانات غير كافية، الحاجة لطلبات متعددة).
  • \n
  • ضعف التصنيف — كل شيء يعتمد على العقد الذي يسهل انتهاكه.
  • \n
\n\n

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

\n\n

GraphQL بلغة Java: أعطني فقط ما أطلبه

\n\n

GraphQL هي لغة استعلام أنشأتها Facebook. في Java، يتم تنفيذها غالبًا عبر مكتبة graphql-java أو التكامل مع Spring — GraphQL Kickstart.

\n\n

العميل هو من يقرر الحقول التي يحتاجها. لا over-fetching. طلب واحد — وتحصل على الدورات مع تقدم الطالب.

\n\n

مثال: مخطط GraphQL و resolver

\n\n

نحدد المخطط:

\n\n
type Course {\n    id: ID!\n    title: String!\n    author: String!\n    progress(studentId: ID!): Int\n}\n\ntype Query {\n    courses: [Course!]!\n}
\n\n

نكتب الـ resolver بلغة Java:

\n\n
@Component\npublic class CourseResolver implements GraphQLQueryResolver {\n\n    @Autowired\n    private CourseService courseService;\n\n    public List<Course> courses() {\n        return courseService.findAll();\n    }\n}\n\n@Component\npublic class CourseFieldResolver implements GraphQLResolver<Course> {\n\n    @Autowired\n    private ProgressService progressService;\n\n    public Integer progress(Course course, Long studentId) {\n        return progressService.getProgress(course.getId(), studentId);\n    }\n}
\n\n

استعلام من العميل:

\n\n
query {\n  courses {\n    title\n                

المدونات

توصيات الكتب