مراجعة - نماذج REST API
جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 78 من 107.
التحدي
سهللنُنشئ نظام نماذج لواجهة REST API لمنصة تدوين! ستنشئ أنواعًا منظّمة جيدًا تُسلسَل إلى JSON وتوفّر تمثيلات نصية سهلة القراءة، تمامًا كما تحتاج عند إنشاء استجابات API حقيقية.
ستنظّم شيفرتك في ملفين:
models.go: عرّف نماذج بيانات API مع وسوم JSON المناسبة والتمثيلات النصية.أنشئ بنية
AuthorبحقولIDمن النوع (int)، وNameمن النوع (string)، وEmailمن النوع (string). اربط هذه الحقول بمفاتيح JSON"id"و"name"و"email". نفّذString()لتُعيد التنسيق[Name] <[Email]>.أنشئ بنية
PostبحقولIDمن النوع (int)، وTitleمن النوع (string)، وContentمن النوع (string)، وAuthor(بنية Author متداخلة)، وPublishedمن النوع (bool). اربط هذه الحقول بـ"id"و"title"و"content"و"author"و"published". يجب أن يستخدم الحقلContentالخيارomitemptyكي لا يظهر المحتوى الفارغ في JSON. نفّذString()لتُعيد"[Title]" by [Author's String representation].أنشئ بنية
APIResponseبحقولSuccessمن النوع (bool)، وMessageمن النوع (string)، وDataمن النوع (Post). اربطها بـ"success"و"message"و"data". يجب أن يستخدم الحقلMessageالخيارomitempty.main.go: أنشئ استجابات API واعرض إخراج JSON والتمثيلات النصية كليهما.اقرأ نوع العملية (
jsonأوdisplay)، ثم اقرأ تفاصيل المنشور: معرّف المنشور، والعنوان، والمحتوى، ومعرّف المؤلف، واسم المؤلف، وبريد المؤلف الإلكتروني، وحالة النشر (trueأوfalse).لـ
json: أنشئ APIResponse معSuccess: trueواجعل المنشور هو البيانات (اترك Message فارغًا). حوّله إلى JSON واطبعه.لـ
display: أنشئ Post واطبعه باستخدام أسلوب String الخاص به، ثم اطبع Author بشكل منفصل في سطر جديد.
ستُوفَّر المدخلات التالية:
- السطر 1: نوع العملية (
jsonأوdisplay) - السطر 2: معرّف المنشور
- السطر 3: العنوان
- السطر 4: المحتوى (قد يكون فارغًا)
- السطر 5: معرّف المؤلف
- السطر 6: اسم المؤلف
- السطر 7: البريد الإلكتروني للمؤلف
- السطر 8: حالة النشر (
trueأوfalse)
على سبيل المثال، عند إدخال:
json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
trueيجب أن يكون الإخراج:
{"success":true,"data":{"id":1,"title":"Getting Started with Go","content":"Learn the basics of Go programming","author":{"id":101,"name":"Jane Smith","email":"jane@example.com"},"published":true}}وعند إدخال:
json
2
Draft Post
102
John Doe
john@example.com
falseيجب أن يكون الإخراج:
{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}لاحظ كيف يُحذف حقل المحتوى الفارغ من إخراج JSON.
وعند إدخال:
display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
trueيجب أن يكون الإخراج:
"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>جرّب بنفسك
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// اقرأ نوع العملية
operation, _ := reader.ReadString('\n')
operation = strings.TrimSpace(operation)
// اقرأ معرّف المنشور
postIDStr, _ := reader.ReadString('\n')
postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))
// اقرأ العنوان
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
// اقرأ المحتوى
content, _ := reader.ReadString('\n')
content = strings.TrimSpace(content)
// اقرأ معرّف المؤلف
authorIDStr, _ := reader.ReadString('\n')
authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))
// اقرأ اسم المؤلف
authorName, _ := reader.ReadString('\n')
authorName = strings.TrimSpace(authorName)
// اقرأ البريد الإلكتروني للمؤلف
authorEmail, _ := reader.ReadString('\n')
authorEmail = strings.TrimSpace(authorEmail)
// اقرأ حالة النشر
publishedStr, _ := reader.ReadString('\n')
published := strings.TrimSpace(publishedStr) == "true"
// TODO: أنشئ بنية Author باستخدام القيم المقروءة
// TODO: أنشئ بنية Post باستخدام القيم المقروءة وAuthor
// TODO: عالج نوع العملية
// إذا كانت operation تساوي "json":
// - أنشئ APIResponse بقيمة Success: true واجعل Post قيمة Data
// - حوّل إلى JSON باستخدام json.Marshal
// - اطبع سلسلة JSON
// إذا كانت operation هي "display":
// - اطبع Post باستخدام الدالة String الخاصة به
// - اطبع Author في سطر جديد
// تعليمة مؤقتة لاستخدام المتغيرات (احذفها عند التنفيذ)
_ = postID
_ = title
_ = content
_ = authorID
_ = authorName
_ = authorEmail
_ = published
_ = operation
_ = json.Marshal
fmt.Println("TODO: Implement the solution")
}
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP في Go
الملفات الخارجيةمساحة العمل والـ Modules في Goالـ Packages والـ Importsالأسماء المصدرة مقابل غير المصدرةمقدمة إلى الـ OOP في Goالـ Structs كـ Classesتعريف الـ Methods في الـ Structsالـ Pointer Receivers مقابل الـ Value Receiversتهيئة الـ Structدوال الـ Constructorمراجعة - آلة حاسبة بسيطة4الواجهات
مقدمة في الواجهاتالتنفيذ الضمنيالواجهة كعقدالواجهة الفارغة (any)تأكيد النوع (Type Assertion)تبديل النوع (Type Switch)تركيب الواجهاتواجهات Stringer و Errorمراجعة - حاسبة الأشكال7التغليف
الحقول المصدرة وغير المصدرةالتغليف على مستوى الحزمةدوال الـ Getter والـ Setterإخفاء المعلومات في Goملخص - سجلات الطلاب10الأنواع العامة (Go 1.18+)
مقدمة في الأنواع العامةمعاملات الأنواعقيود الأنواعالـ Structs العامةحل بديل للـ Methods العامةملخص - المجموعات العامة13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Abstract Factoryنمط Observerنمط Strategy2تعمق في الأنواع و Structs
الأنواع الأساسية والمركبةتعريفات الأنواع المخصصةStruct TagsStructs مجهولةStructs متداخلةالقيم الصفرية والافتراضيةمراجعة - دفتر العناوين5التركيب بدلاً من الوراثة
لماذا لا تدعم Go الوراثةأساسيات تضمين الـ Structترقية الـ Methodتضمين عدة Structsالتضمين مقابل التجميعحجب الـ Methods المضمنةملخص - الهيكل الهرمي للموظفين8معالجة الأخطاء و OOP
واجهة errorأنواع الأخطاء المخصصةتغليف الأخطاء (fmt.Errorf)أخطاء Sentinelerrors.Is() و errors.As()Panic و Defer و Recoverملخص - File Parser11المكتبة القياسية والبرمجة كائنية التوجه (OOP)
io.Reader و io.Writerواجهة sort.Interfaceواجهة fmt.Stringerencoding/json مع Structsواجهة http.Handlerمراجعة - نماذج REST API14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبMiddleware كنمط مزين3المؤشرات والذاكرة
أساسيات المؤشرات في Goالمؤشرات إلى الـ Structsالتمرير بالقيمة مقابل التمرير بالمرجعدالة ()newGarbage Collection في Goملخص - بناء Linked List6تعدد الأشكال في Go
تعدد الأشكال عبر InterfacesDuck Typing في Goقواعد استيفاء الـ Interfaceمجموعات متعددة الأشكالحقن التبعيةمراجعة - معالج الدفع9التزامن والبرمجة كائنية التوجه (OOP)
أساسيات الـ Goroutinesالقنوات (Channels) والاتصالالقنوات المخزنة (Buffered) مقابل غير المخزنةجملة Selectsync.Mutex و sync.RWMutexsync.WaitGroupتصميم الـ Structs الآمنة للخيوط (Thread-Safe)مراجعة - Worker Poolتدرّب بنفسك: مترجم Go عبر الإنترنت