Mahdyar's Blog

My Thoughts

رست‌فول ای‌پی‌آی در گولنگ – قسمت صفرم

ساخت یک رست‌فول ای‌پی‌آی در گولنگ - قسمت صفرم

پیش‌نیاز‌ها

برای این آموزش – ساخت یک رست‌فول ای‌پی‌آی در گولنگ – نیاز به +Go 1.11 خواهیم داشت. پس اگر نصب ندارید، می‌تونید از این‌جا نصب کنید. همچنین خوبه که یک آشنایی نسبی‌ای با گولنگ داشته باشید. 🙂

هدف

در آخر این آموزش، شما متوجه می‌شید که چیجوری می‌تونید یک رست‌فول ای‌پی‌آی برای خودتون بنویسید و درخواست‌های POST، GET، PUT و DELETE خودتون رو هندل بکنید.

شروع با یک ای‌پی‌آی ساده

خُب! برای شروع یک سرور ساده نیاز داریم که بیاد درخواست‌های HTTP رو هندل بکنه. برای این‌کار، یک فایل به نام main.go درست می‌کنیم با محتویات زیر:

package main

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

func homePage(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(w, "Welcome to the HomePage!")
}

func handleRequests() {
    http.HandleFunc("/", homePage)
    log.Fatal(http.ListenAndServe(":10000", nil))
}

func main() {
    handleRequests()
}

۳ تا فانکشن تعریف کردیم، که به جز main که فانکشن اصلی برنامه هست، بقیه رو توضیح می‌دم که هر کدوم قراره چی‌کار بکنن:

homePage: این قراره درخواست‌هایی که به صفحهٔ اصلی فرستاده می‌شن رو هندل بکنه.

handleRequests: این هم قراره الگوی path یوآرآل رو مطابقت بده با کد ما و فانکشن مناسب‌ش رو کال کنه.

اگر پروسهٔ دیگه‌ای به پورت ۱۰۰۰ دستگاه شما نیاز نداشته باشه، بعد از اجرای قطعه‌کد بالا باید در http://localhost:10000 صفحهٔ اصلی رو ببینید.

خب. ما حالا می‌خوایم CRUD رو در APIمون پیاده کنیم. برای این‌کار نیاز داریم قابلیت ساختن، خوندن، آپدیت کردن و پاک‌کردن رو برای مقالات داشته باشیم. نگفته بودم؟ سایت‌مون قراره یک وبلاگ باشه.

خب، الآن وقتشه که struct مقالات رو تعریف کنیم:

type Article struct {
    Title string `json:"Title"`
    Desc string `json:"desc"`
    Content string `json:"content"`
}

var Articles []Article

خب همین‌طور که مشخصه، مقالات ما، عنوان، توضیحات و محتوا دارن. همچنین یک آرایه اون پایین از مقالات‌مون ساختیم که به جای دیتابیس از اون استفاده کنیم.

اگر نمی‌دونید

`json:"Title"`

یعنی چی، می‌تونید با کلیدواژهٔ «golang tags» به نتایج خوبی برسید.

بدیهیه که برای کار با جی‌سون، "encoding/json" هم باید ایمپورت بشه.

خب، الآن در فانکشن main اطلاعات الکی‌مون رو وارد می‌کنیم تا بعداً بتونیم بخونیم‌شون و آپدیت‌شون کنیم:

func main() {
    Articles = []Article{
        Article{Title: "Article Title 1", Desc: "Article Description 1", Content: "Article Content 1"},
        Article{Title: "Article Title 2", Desc: "Article Description 2", Content: "Article Content 2"},
    }
    handleRequests()
}

خب، تا اینجا هرچی که برای شروع کار لازم بوده رو فراهم کردیم. حالا بریم سراغ نمایش مقالات.

نمایش(دریافت) مقالات

خب، الآن می‌خوایم اگر تایپ ریکوئست GET بود، مقالات رو برگردونیم. برای شروع یک فانکشن تعریف می‌کنیم که مقالات رو JSON encoded برگردونه:

func returnAllArticles(w http.ResponseWriter, r *http.Request){
    json.NewEncoder(w).Encode(Articles)
}

درون تابع، در خط اول داریم تابعی رو صدا می‌زنیم که با دریافت یک آرایه، یک استرینگ جیسون بر می‌گردونه.

قبل از این‌که این قطعه کد کار بکنه، باید یک route هم به فانکشن handleRequestsمون اضافه بکنیم که درخواست‌هایی که به http://localhost:10000/articles ارسال می‌شن رو هندل بکنه:

func handleRequests() {
    http.HandleFunc("/", homePage)
    // اضافه کردن route articles 
    // و هندل کردنش با فانکشن returnAllArticles
    http.HandleFunc("/articles", returnAllArticles)
}

حالا با اجرای دستور go run main.go، و بازکردن لینک زیر با مرورگرتون، باید جیسون‌شده لیست مقالات‌تون رو ببینید:

http://localhost:10000/articles

[
  {
    Title: "Article Title 1",
    desc: "Article Description 1",
    content: "Article Content 1"
  },
  {
    Title: "Article Title 2",
    desc: "Article Description 2",
    content: "Article Content 2"
  }
];

در قسمت بعدی این سری پست‌های آموزش ساخت یک رست‌فول ای‌پی‌آی در گولنگ، از gorilla/mux router به جای router خود گولنگ (net/http) استفاده می‌کنیم و CRUDمون رو کامل می‌کنیم.