Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - نماذج REST API

جزء من قسم Object Oriented Programming في رحلة GO على Coddy. الدرس 78 من 107.

challenge icon

التحدي

سهل

لنقم ببناء نظام نماذج 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 والمنشور (Post) كبيانات (اترك Message فارغاً). قم بتحويله إلى JSON واطبعه.

    بالنسبة لـ display: أنشئ المنشور (Post) واطبعه باستخدام تابع String الخاص به، ثم اطبع الكاتب (Author) بشكل منفصل في سطر جديد.

سيتم توفير المدخلات التالية:

  • السطر 1: نوع العملية (json أو display)
  • السطر 2: معرف المنشور (Post ID)
  • السطر 3: العنوان
  • السطر 4: المحتوى (قد يكون فارغاً)
  • السطر 5: معرف الكاتب (Author ID)
  • السطر 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)

	// قراءة post ID
	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)

	// قراءة author ID
	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 struct بالقيم المقروءة

	// TODO: إنشاء Post struct بالقيم المقروءة والـ Author

	// TODO: التعامل مع نوع العملية
	// إذا كانت العملية "json":
	//   - إنشاء APIResponse مع Success: true والـ Post كـ Data
	//   - التحويل إلى JSON باستخدام json.Marshal
	//   - طباعة نص الـ JSON
	// إذا كانت العملية "display":
	//   - طباعة الـ Post باستخدام طريقة String الخاصة به
	//   - طباعة الـ Author في سطر جديد

	// مكان محجوز لاستخدام المتغيرات (يُحذف عند التنفيذ)
	_ = postID
	_ = title
	_ = content
	_ = authorID
	_ = authorName
	_ = authorEmail
	_ = published
	_ = operation
	_ = json.Marshal
	fmt.Println("TODO: Implement the solution")
}

جميع دروس Object Oriented Programming

تدرّب بنفسك: مترجم Go عبر الإنترنت