توليد Swagger/OpenAPI لـ Kotlin: من المواصفات إلى الكود الجاهز
\n\nتطوير واجهات برمجة التطبيقات الحديثة يتطلب توثيقًا واضحًا وتوليدًا سريعًا لكود العميل والخادم. Swagger/OpenAPI هو معيار لوصف واجهات RESTful، والذي يسمح بإنشاء كود Kotlin تلقائيًا، مما يريح المطور من الكتابة الروتينية لـ DTO ووحدات التحكم والعملاء. في هذه المقالة، سنستعرض الأدوات الرئيسية، أمثلة الإعداد، وسيناريوهات الاستخدام العملية.
\n\nما هو OpenAPI ولماذا يحتاجه مطور Kotlin؟
\n\nOpenAPI (المعروف سابقًا باسم Swagger) هو مواصفات بتنسيق YAML أو JSON تصف نقاط النهاية، نماذج البيانات، معاملات الطلبات والاستجابات. بالنسبة لـ Kotlin، يوفر توليد الكود من OpenAPI ما يلي:
\n- \n
- الأتمتة — إنشاء فئات data، enum، واجهات وحدات التحكم \n
- التوافق — الكود يتوافق دائمًا مع التوثيق \n
- توفير الوقت — لا حاجة لكتابة التسلسل/إلغاء التسلسل يدويًا \n
- دعم الأطر — Ktor, Spring Boot, Retrofit, Micronaut \n
الأدوات الرئيسية للتوليد
\n\nتوجد عدة حلول ناضجة لـ Kotlin:
\n\n1. OpenAPI Generator (المولد الرسمي)
\nالأداة الأكثر شيوعًا. تدعم عشرات اللغات والأطر. لـ Kotlin، تتوفر المولدات التالية:
\n- \n
kotlin-client— عميل على Ktor أو Retrofit \n kotlin-server— خادم على Ktor أو Spring \n kotlin-spring— وحدات تحكم Spring Boot \n
2. إضافة Ktor OpenAPI
\nإضافة لإطار Ktor، تقوم بتوليد توثيق OpenAPI من الكود (نهج عكسي).
\n\n3. Swagger Codegen (قديم)
\nسلف OpenAPI Generator، لا يزال مستخدمًا، لكن يُوصى بالترحيل إلى الإصدار الجديد.
\n\nمثال: توليد عميل Kotlin من مواصفات OpenAPI
\n\nلننظر إلى مثال عملي. لنفترض أن لدينا ملف petstore.yaml (مواصفات Petstore القياسية). سنقوم بتوليد عميل Kotlin باستخدام OpenAPI Generator.
الخطوة 1. تثبيت OpenAPI Generator
\nعبر Homebrew (macOS/Linux):
\nbrew install openapi-generator\nأو عبر Docker:
\ndocker run --rm -v ${PWD}:/local openapitools/openapi-generator-cli generate \\\n -i /local/petstore.yaml \\\n -g kotlin-client \\\n -o /local/out/kotlin-client\n\nالخطوة 2. إعداد التوليد
\nلنقم بإنشاء ملف الإعداد config.json:
{\n "packageName": "com.pythonlib.petstore.client",\n "library": "ktor",\n "serializationLibrary": "kotlinx_serialization",\n "useCoroutines": true\n}\n\nالخطوة 3. تشغيل التوليد
\nopenapi-generator generate \\\n -i petstore.yaml \\\n -g kotlin-client \\\n -o ./generated-client \\\n -c config.json\n\nالنتيجة: الكود المولد
\nفي المجلد generated-client ستظهر:
- \n
src/main/kotlin/com/pythonlib/petstore/client/models/Pet.kt\n src/main/kotlin/com/pythonlib/petstore/client/api/PetApi.kt\n
مثال على DTO المولد:
\n@Serializable\ndata class Pet(\n val id: Long? = null,\n @SerialName("category")\n val category: Category? = null,\n @SerialName("name")\n val name: String,\n @SerialName("photoUrls")\n val photoUrls: List<String>,\n val tags: List<Tag>? = null,\n val status: PetStatus? = null\n)\n\n@Serializable\nenum class PetStatus {\n @SerialName("available")\n Available,\n @SerialName("pending")\n Pending,\n @SerialName("sold")\n Sold\n}\n\nمثال على عميل API المولد (Ktor):
\nclass PetApi(private val client: HttpClient) {\n\n suspend fun addPet(pet: Pet): Pet = cli