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

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

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

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

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

  • السطر 1: نوع العملية (json أو display)
  • السطر 2: معرّف Post
  • السطر 3: العنوان
  • السطر 4: المحتوى (قد يكون فارغًا)
  • السطر 5: معرّف Author
  • السطر 6: اسم Author
  • السطر 7: البريد الإلكتروني لـ Author
  • السطر 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: تعامل مع نوع العملية
	// إذا كانت العملية "json":
	//   - أنشئ APIResponse مع Success: true و Post كـ Data
	//   - حوّل إلى JSON باستخدام json.Marshal
	//   - اطبع سلسلة JSON
	// إذا كانت operation هي "display":
	//   - اطبع Post باستخدام method الـ String الخاصة به
	//   - اطبع Author في سطر جديد

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

جميع دروس البرمجة كائنية التوجه

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