بناء أول API حقيقي لي بلغة Go باستخدام Gin
أنتقل الآن من الجانب النظري إلى التطبيق العملي.
بعد دراسة الـ structs، والـ interfaces، والـ goroutines، ومعالجة الأخطاء (error handling)، قمت ببناء API للطلبات (Orders API) يعمل بشكل فعلي باستخدام لغة Go وإطار العمل Gin.
يقوم الـ API بثلاث مهام:
- إنشاء طلب (Create an order)
- جلب طلب بواسطة المعرف (Fetch an order by ID)
- عرض جميع الطلبات (List all orders)
اخترت Gin لأنه يسهل عملية التوجيه (routing) والبرمجيات الوسيطة (middleware). فهو يوفر دوال مساعدة مثل c.JSON و c.AbortWithStatusJSON. هذه الأدوات تقلل من تكرار الكود.
هيكلية المشروع: استخدمت تخطيط حزم مسطح (flat package layout) للحفاظ على نظافة الكود:
- handler: يدير منطق الـ HTTP.
- model: يحدد أشكال البيانات (data shapes).
- store: يتعامل مع تخزين البيانات.
- middleware: يدير عمليات التسجيل (logging) والطلبات.
الخيارات التقنية الرئيسية:
• التحقق من صحة البيانات (Data Validation) استخدمت struct tags لعملية تسلسل JSON (JSON serialization). كما استخدمت Gin binding tags. يضمن ذلك وجود الحقول المطلوبة وأن تكون المبالغ أكبر من الصفر.
• الاستمرارية والتزامن (Persistence and Concurrency)
تستخدم النسخة الحالية مخزناً في الذاكرة (in-memory store). استخدمت sync.RWMutex لإدارة الوصول المتزامن. يتيح هذا عمليات قراءة متعددة مع الحفاظ على سلامة عمليات الكتابة.
• الواجهات (Interfaces)
يعتمد الـ handler على واجهة OrderStore. لا يهمه ما إذا كانت البيانات مخزنة في الذاكرة أو في قاعدة بيانات، مما يجعل استبدال طبقة التخزين أمراً سهلاً.
• معالجة الأخطاء (Error Handling)
استخدمت errors.Is للتحقق من أخطاء محددة مثل ErrNotFound. يتيح ذلك للـ API إرجاع رمز الحالة 404 المناسب للمستخدم.
• البرمجيات الوسيطة (Middleware) قمت ببناء مسجل (logger) مخصص. يقوم بتتبع الطريقة (method)، والمسار (path)، ورمز الحالة (status code)، ومدة الطلب (request duration).
يجمع هذا الإعداد كل ما تم تعلمه في الأجزاء السابقة. إنه أساس وظيفي، ومنظم، وقابل للتوسع.
كيف تقوم بهيكلة مشاريع Go الخاصة بك؟ هل تفضل الحزم المسطحة (flat packages) أم التداخل العميق القائم على النطاق (domain-driven nesting)؟
المصدر: https://dev.to/mihirmohapatra/building-my-first-real-api-in-go-with-gin-3kio