توليد Swagger/OpenAPI لجافا: نظرة عامة شاملة على الأدوات والمكتبات
\n\nتطوير REST API الحديث في جافا لا يمكن تصوره بدون توثيق عالي الجودة. أصبح معيار OpenAPI (المعروف سابقًا باسم Swagger Specification) المعيار الصناعي الفعلي لوصف HTTP API. في هذه المقالة، سنقوم بتحليل المكتبات والأدوات الرئيسية لتوليد مواصفات OpenAPI في تطبيقات جافا، وإمكانياتها، وأمثلة الاستخدام، ومعايير الاختيار.
\n\nما هو OpenAPI ولماذا هو مطلوب؟
\n\nOpenAPI هي مواصفة تصف RESTful API بتنسيق JSON أو YAML. تتضمن:
\n- \n
- قائمة بنقاط النهاية وطرق HTTP؛ \n
- نماذج البيانات (مخططات الطلبات والاستجابات)؛ \n
- المعلمات (query، path، header)؛ \n
- معلومات حول المصادقة والتفويض. \n
التوثيق الذي يتم إنشاؤه بواسطة OpenAPI يسمح بإنشاء SDK للعميل تلقائيًا، وإجراء الاختبارات، والحفاظ على تحديث وصف API. بالنسبة لجافا، هناك العديد من الحلول الناضجة.
\n\n1. SpringDoc OpenAPI (موصى به لـ Spring Boot)
\n\nSpringDoc هي المكتبة الأكثر شيوعًا لتوليد OpenAPI 3 في نظام Spring البيئي. تقوم تلقائيًا بمسح المتحكمات (Controllers)، والتعليقات التوضيحية @RequestMapping، @GetMapping، وما إلى ذلك، وبناء المواصفة بناءً عليها.
الإضافة (Maven)
\n<dependency>\n <groupId>org.springdoc</groupId>\n <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>\n <version>2.6.0</version>\n</dependency>\n\nمثال على متحكم مع التعليقات التوضيحية
\n@RestController\n@RequestMapping("/api/users")\npublic class UserController {\n\n @Operation(summary = "الحصول على مستخدم بواسطة المعرف")\n @ApiResponses(value = {\n @ApiResponse(responseCode = "200", description = "تم العثور على المستخدم"),\n @ApiResponse(responseCode = "404", description = "لم يتم العثور على المستخدم")\n })\n @GetMapping("/{id}")\n public ResponseEntity<User> getUser(@PathVariable Long id) {\n // المنطق\n return ResponseEntity.ok(new User(id, "إيفان", "ivan@example.com"));\n }\n}\nبعد تشغيل التطبيق، يكون التوثيق متاحًا على العنوان /swagger-ui.html، والمواصفة بتنسيق JSON على /v3/api-docs.
2. Swagger Core (OpenAPI 3.0)
\n\nSwagger Core هي مكتبة منخفضة المستوى من منشئي المواصفة. تسمح ببناء كائنات OpenAPI برمجيًا وتسلسلها إلى JSON/YAML. مناسبة للحالات التي تحتاج فيها إلى تحكم دقيق في التوليد.
مثال على إنشاء المواصفة برمجيًا
\nimport io.swagger.v3.oas.models.*;\nimport io.swagger.v3.oas.models.info.*;\n\nOpenAPI openAPI = new OpenAPI()\n .info(new Info()\n .title("مثال API")\n .version("1.0.0")\n .description("توثيق تم إنشاؤه يدويًا"))\n .path("/hello", new PathItem()\n .get(new Operation()\n .summary("تحية")\n .operationId("sayHello")\n .addParametersItem(new Parameter()\n .name("name")\n .in("query")\n .required(false)\n .schema(new StringSchema()))\n .responses(new ApiResponses()\n .addApiResponse("200", new ApiResponse()\n .description("موافق")\n .content(new Content()\n .addMediaType("text/plain", \n new MediaType().schema(new StringSchema())))))));\n\n// التسلسل إلى JSON\nObjectMapper mapper = new ObjectMapper();\nString json = mapper.writeValueAsString(openAPI);\nSystem.out.println(json);\n\n3. OpenAPI Generator (توليد الكود بناءً على المواصفة)
\n\nOpenAPI Generator هي أداة تعمل بالعكس