How-To Guides

ساخت APIهای REST مقیاس‌پذیر با Go: راهنمای توسعه‌دهنده

مقدمه

گو (Go)، که اغلب به عنوان Golang شناخته می‌شود، به سرعت به گزینه‌ای ترجیحی برای ساخت سرویس‌های بک‌اند با عملکرد بالا تبدیل شده است. مدل همزمانی، تایپ ایستا و سرعت اجرای استثنایی آن، آن را به گزینه‌ای ایده‌آل برای معماری‌های میکروسرویس مدرن تبدیل کرده است. اگرچه فریم‌ورک‌هایی مانند Gin یا Echo راحتی را ارائه می‌دهند، درک چگونگی ساخت APIهای REST با استفاده از کتابخانه استاندارد Go برای تسلط بر مکانیک‌های زیرین زبان حیاتی است. این راهنما شما را در ایجاد یک API REST پایه و کاربردی تنها با استفاده از کتابخانه استاندارد راهنمایی می‌کند و پایه‌ای محکم را پیش از حرکت به سمت ابزارهای شخص ثالث فراهم می‌سازد.

تنظیم ساختار پروژه

پیش از نوشتن کد، ماژول Go خود را مقداردهی اولیه کنید. ترمینال خود را باز کنید و دستور زیر را در دایرکتوری پروژه خود اجرا کنید:

go mod init my-rest-api

این دستور یک فایل go.mod ایجاد می‌کند که وابستگی‌های پروژه شما را مدیریت می‌کند. برای این آموزش، ما تنها به بسته‌های داخلی net/http و encoding/json گو تکیه خواهیم کرد.

تعریف ساختارهای داده

بیایید با تعریف یک منبع ساده شروع کنیم: یک «وظیفه» (Task). ما از یک ساختار (struct) برای نمایش این داده استفاده می‌کنیم. تگ‌های `json` برای مارشالینگ و آنمارشالینگ داده‌های JSON به و از درخواست‌ها و پاسخ‌های HTTP ضروری هستند.

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
)

type Task struct {
    ID     string `json:"id"`
    Title  string `json:"title"`
    Done   bool   `json:"done"`
}

پیاده‌سازی هندلرهای HTTP

بسته net/http گو از رابط HandlerFunc استفاده می‌کند. یک هندلر صرفاً یک تابع با امضای func(http.ResponseWriter, *http.Request) است. بیایید یک هندلر برای لیست کردن تمام وظایف و دیگری برای ایجاد یکی جدید پیاده‌سازی کنیم.

هندلر لیست

این هندلر یک برش (slice) سراسری از وظایف را می‌خواند و آن را به یک پاسخ JSON مارشال می‌کند. مهم است که هدر Content-Type را به درستی تنظیم کنید تا مشتریان بدانند چگونه محتوا را تفسیر کنند.

var tasks []Task

func listTasks(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(tasks)
}

هندلر ایجاد

این هندلر منتظر درخواست‌های POST است. آن بدنه JSON ورودی را در یک ساختار Task جدید آنمارشال می‌کند، آن را به برش ما اضافه می‌کند و شیء ایجاد شده را با کد وضعیت 201 Created برمی‌گرداند.

func createTask(w http.ResponseWriter, r *http.Request) {
    var newTask Task
    // Decode the JSON body from the request
    err := json.NewDecoder(r.Body).Decode(&newTask)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    // Add ID logic here (e.g., using uuid package)
    newTask.ID = "1" 
    tasks = append(tasks, newTask)

    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(newTask)
}

مسیریابی و پیکربندی سرور

اکنون که هندلرهای ما تعریف شده‌اند، باید آن‌ها را به مسیرهای URL خاصی نگاشت کنیم. در گو، ما از http.HandleFunc یا http.NewServeMux برای مسیریابی پیچیده‌تر استفاده می‌کنیم.

func main() {
    // Initialize the tasks slice
    tasks = []Task{
        {ID: "1", Title: "Learn Go", Done: false},
    }

    // Register routes
    http.HandleFunc("/tasks", listTasks)
    http.HandleFunc("/tasks/create", createTask)

    // Start the server on port 8080
    log.Println("Server starting on :8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

نتیجه‌گیری

ساخت APIهای REST با استفاده از کتابخانه استاندارد Go ساده و قدرتمند است. با بهره‌گیری از net/http و encoding/json، شما کنترل دقیقی بر سرور خود کسب می‌کنید بدون اینکه با سربار فریم‌ورک‌های بزرگ مواجه شوید. اگرچه این مثال پایه‌ای است، اما مفاهیم کلیدی مانند مارشالینگ JSON، کدهای وضعیت و مدیریت درخواست‌ها را نشان می‌دهد که در هر برنامه وب Go کاربرد دارند. برای برنامه‌های تولیدی، در نظر بگیرید که افزودن میان‌افزار (middleware) برای ثبت وقایع (logging)، احراز هویت و CORS، یا تغییر به یک مسیریاب مانند Chi یا Gin برای نیازهای مسیریابی پیچیده‌تر. کدنویسی شادی داشته باشید!

Share: