برنامه نویسی

ساخت یک API ساده RESTful در Go برای مدیریت پست های وبلاگ

Summarize this content to 400 words in Persian Lang

مقدمه

ما می دانیم که بهترین راه برای یادگیری ساختن مطالب در حین یادگیری است، بنابراین من وارد ساخت یک API RESTful برای مدیریت پست های وبلاگ شدم. این یک پروژه ساده است که به شما امکان می دهد جمسئولیت rاد، توpdate و دپست‌های حذفی – اساساً کلاسیک خام عملیات من Go رو انتخاب کردم چون باهاش ​​آشنایی دارم😂😂😎😂! این یک زبان عالی برای این نوع پروژه است، و از آنجایی که من از قبل راه خود را در مورد آن می دانم، کل فرآیند را روان تر می کند. به علاوه، عملکرد Go درجه یک است، که آن را برای رسیدگی سریع به درخواست‌های API عالی می‌کند.

1. بررسی اجمالی

در این آموزش، کل فرآیند ایجاد یک API ساده RESTful در Go را برای مدیریت پست‌های وبلاگ بررسی می‌کنیم. API به ما این امکان را می دهد که عملیات اصلی CRUD را انجام دهیم: ایجاد، خواندن، به روز رسانی و حذف پست ها. ما برنامه را با چند فایل ساده ساختار می دهیم تا همه چیز روشن باشد.

2. نقطه ورود ما

فایل: main.go

package main

import (
“log”
“net/http”

“your_project/route” // import your route package
)

func main() {
r := route.NewRouter() // initialize the router
log.Fatal(http.ListenAndServe(“:8080”, r)) // start the server
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این فایل سرور HTTP و مسیرها را با استفاده از mux روتر سرور روی پورت گوش می دهد 8080، و تمام مسیرها را در داخل تعریف می کنیم route.NewRouter() تابع

3. مدل پست

فایل: model.go

package model

type Post struct {
Title string
Content string
Tags []string
Author string
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این Post struct مدل ما است که نشان دهنده یک پست وبلاگ است. شامل فیلدهایی برای Title، Content، Tags، و Author. هر پست با این فیلدها در حافظه ذخیره می شود.

4. تنظیم مسیرها برای عملیات CRUD

فایل: route.go

package route

import (
“github.com/gorilla/mux”

“your_project/handler”
“your_project/middleware”
)

func NewRouter() *mux.Router {
r := mux.NewRouter()
// create a post
r.HandleFunc(“/create”, handler.CreatePost).Methods(“POST”)
// list the titles of all posts
r.HandleFunc(“/list”, handler.ListPosts).Methods(“GET”)
// get a post by the post title
r.HandleFunc(“/post”, handler.GetPostByTitle).Methods(“GET”)
// edit a post
r.HandleFunc(“/edit”, handler.UpdatePost).Methods(“PUT”)
// delete a blog post
r.HandleFunc(“/delete”, middleware.RequireAuth(handler.DeletePost)).Methods(“DELETE”)
return r
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا، ما تمام مسیرها را برای عملیات CRUD تعریف می کنیم:

ایجاد پست: POST /create

لیست همه پست ها: GET /posts

دریافت پست بر اساس عنوان: GET /blogs

به روز رسانی پست: PUT /edit

حذف پست: DELETE /delete

5. پیاده سازی Handlers

فایل: handler.go

package handler

import (
“encoding/json”
“fmt”
“net/http”

“your_project/model”
)
// a in-built memory database to store and retrieve our posts.
var allPosts = make(map[string]model.Post)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

func CreatePost(w http.ResponseWriter, r *http.Request) {
var post model.Post
// read content from request body into a new decoder
decoder := json.NewDecoder(r.Body)
// decode content into our Post struct
err := decoder.Decode(&post)
if err != nil {
http.Error(w, “Failed to decode request body”, http.StatusInternalServerError)
return
}
// check for unique post title
_, ok := allPosts[post.Title] if ok {
http.Error(w, “Post title already exists”, http.StatusBadRequest)
return
}

// append post to our memory
allPosts[post.Title] = post

// prints out structs with field names
fmt.Fprintf(w, “%+v”, post)
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

func ListPosts(w http.ResponseWriter, r *http.Request) {
titles := []string{}

for _, post := range allPosts {
titles = append(titles, post.Title)
}

if len(titles) == 0 {
http.Error(w, “no posts found”, http.StatusNotFound)
}

json.NewEncoder(w).Encode(titles)
// uncomment to print out structs with field names
// fmt.Fprintf(w,”%+v”,titles)
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

func GetPostByTitle(w http.ResponseWriter, r *http.Request) {
// retrieve title of post
title := r.URL.Query().Get(“title”)
if title == “” {
http.Error(w, “Title is required”, http.StatusBadRequest)
return
}

// check title is present
post, ok := allPostsBuilding a Simple RESTful API in Go for Managing Blog Posts
if !ok {
http.Error(w, “Post not found”, http.StatusNotFound)
return

}

// encode the contents
if err := json.NewEncoder(w).Encode(post); err != nil {
http.Error(w, “Post not found”, http.StatusInternalServerError)
return
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

func UpdatePost(w http.ResponseWriter, r *http.Request) {
// get title
// check title is provided
title := r.URL.Query().Get(“title”)
if title == “” {
http.Error(w, “Title is required”, http.StatusBadRequest)
return
}

// check if such post exists
post, ok := allPostsBuilding a Simple RESTful API in Go for Managing Blog Posts
if !ok {
http.Error(w, “BlogPost not found”, http.StatusNotFound)
return
}
var updatedPost model.Post

// read request body
if err := json.NewDecoder(r.Body).Decode(&updatedPost); err != nil {
http.Error(w, “Failed to decode request body”, http.StatusBadRequest)
return
}

// update post
allPostsBuilding a Simple RESTful API in Go for Managing Blog Posts = updatedPost
post = updatedPost

// return ok status
w.WriteHeader(http.StatusOK)

// return updated content
json.NewEncoder(w).Encode(post)

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

func DeletePost(w http.ResponseWriter, r *http.Request) {
title := r.URL.Query().Get(“title”)

// retrieve post
_, ok := allPostsBuilding a Simple RESTful API in Go for Managing Blog Posts
if !ok {
http.Error(w, “No post with such title”, http.StatusNotFound)
}
// deletes the post from the map.
delete(allPosts, title)

w.WriteHeader(http.StatusOK)
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این توابع کنترل کننده منطق هر عملیات CRUD را مدیریت می کنند. آنها بدن درخواست (برای POST و PUT درخواست ها)، تعامل با پایگاه داده درون حافظه (allPosts) و بر این اساس پاسخ ها را ارسال کنید.

6. میان افزار (احراز هویت)

فایل: auth.go

package middleware

import “net/http”

func RequireAuth(f http.HandlerFunc) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// check if user is authenticated
token := r.Header.Get(“Authorization”)
if token != “Bearer Secret” {
http.Error(w,”Unathorized”, http.StatusUnauthorized)
return
}
f.ServeHTTP(w,r)
})
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تابع میان‌افزار یک سرصفحه مجوز معتبر را بررسی می‌کند. اگر توکن نیست Bearer Secret، یک پاسخ غیرمجاز برمی گرداند.

7. برنامه را اجرا کنید

دستورات زیر را برای مقداردهی اولیه و مرتب کردن وابستگی ها اجرا کنید:اجرا کنید تا نصب کنید

cd your_project
go mod init your_project
go mod tidy

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

8. تست API ما

هنگامی که API راه اندازی و اجرا می شود، می توانید نقاط پایانی را با استفاده از دستورات curl آزمایش کنید.

سرور را اجرا کنید:

go run main.go

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با استفاده از curl

سپس، در پنجره ترمینال دیگر، استفاده کنید curl برای آزمایش:

curl -X POST -H “Content-Type: application/json” -d ‘{“title”:”My First Post”, “content”:”This is the content.”, “author”:”John Doe”}’ http://localhost:8080/create

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

curl -X GET ‘http://localhost:8080/post?title=My%20First%20Post’

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

curl http://localhost:8080/list

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

curl -X PUT -H “Content-Type: application/json” -d ‘{“Title”:”My First Post”, “Content”:”Updated content.”, “Author”:”John Doe”}’ ‘http://localhost:8080/edit?title=My%20Blog%20Post’

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

curl -X DELETE -H “Authorization: Bearer Secret” ‘http://localhost:8080/delete?title=My%20First%20Post’

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با استفاده از Thunder Client

Thunder Client یک ابزار تست API سبک و قدرتمند است که معمولاً در کد ویژوال استودیو (VS Code) استفاده می شود. این یک رابط کاربر پسند برای ایجاد درخواست های API ارائه می دهد.

نحوه استفاده از Thunder Client برای درخواست های API را بررسی کنید:

نتیجه گیری

و شما آن را دارید – API RESTful خودتان برای مدیریت پست های وبلاگ، ساخته شده با قدرت Go! 🚀. از ایجاد پست تا به روز رسانی، حذف و مشاهده آنها.اما صبر کنید — آیا می خواهید احراز هویت کاربر را اضافه کنید، داده ها را در یک پایگاه داده ذخیره کنید یا API خود را حتی مقیاس پذیرتر کنید؟ برو دنبالش! 🔥

مقدمه

ما می دانیم که بهترین راه برای یادگیری ساختن مطالب در حین یادگیری است، بنابراین من وارد ساخت یک API RESTful برای مدیریت پست های وبلاگ شدم. این یک پروژه ساده است که به شما امکان می دهد جمسئولیت rاد، توpdate و دپست‌های حذفی – اساساً کلاسیک خام عملیات من Go رو انتخاب کردم چون باهاش ​​آشنایی دارم😂😂😎😂! این یک زبان عالی برای این نوع پروژه است، و از آنجایی که من از قبل راه خود را در مورد آن می دانم، کل فرآیند را روان تر می کند. به علاوه، عملکرد Go درجه یک است، که آن را برای رسیدگی سریع به درخواست‌های API عالی می‌کند.

1. بررسی اجمالی

در این آموزش، کل فرآیند ایجاد یک API ساده RESTful در Go را برای مدیریت پست‌های وبلاگ بررسی می‌کنیم. API به ما این امکان را می دهد که عملیات اصلی CRUD را انجام دهیم: ایجاد، خواندن، به روز رسانی و حذف پست ها. ما برنامه را با چند فایل ساده ساختار می دهیم تا همه چیز روشن باشد.

2. نقطه ورود ما

فایل: main.go

package main

import (
    "log"
    "net/http"

    "your_project/route" // import your route package
)

func main() {
    r := route.NewRouter() // initialize the router
    log.Fatal(http.ListenAndServe(":8080", r)) // start the server
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این فایل سرور HTTP و مسیرها را با استفاده از mux روتر سرور روی پورت گوش می دهد 8080، و تمام مسیرها را در داخل تعریف می کنیم route.NewRouter() تابع

3. مدل پست

فایل: model.go

package model

type Post struct {
    Title   string
    Content string
    Tags    []string
    Author   string
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این Post struct مدل ما است که نشان دهنده یک پست وبلاگ است. شامل فیلدهایی برای Title، Content، Tags، و Author. هر پست با این فیلدها در حافظه ذخیره می شود.

4. تنظیم مسیرها برای عملیات CRUD

فایل: route.go

package route

import (
    "github.com/gorilla/mux"

    "your_project/handler"
    "your_project/middleware"
)

func NewRouter() *mux.Router {
    r := mux.NewRouter()
// create a post
    r.HandleFunc("/create", handler.CreatePost).Methods("POST")
// list the titles of all posts
    r.HandleFunc("/list", handler.ListPosts).Methods("GET")
// get a post by the post title
    r.HandleFunc("/post", handler.GetPostByTitle).Methods("GET")
// edit a post
    r.HandleFunc("/edit", handler.UpdatePost).Methods("PUT")
// delete a blog post
    r.HandleFunc("/delete", middleware.RequireAuth(handler.DeletePost)).Methods("DELETE")
    return r
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا، ما تمام مسیرها را برای عملیات CRUD تعریف می کنیم:

  • ایجاد پست: POST /create
  • لیست همه پست ها: GET /posts
  • دریافت پست بر اساس عنوان: GET /blogs
  • به روز رسانی پست: PUT /edit
  • حذف پست: DELETE /delete

5. پیاده سازی Handlers

فایل: handler.go

package handler

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

    "your_project/model"
)
// a in-built memory database to store and retrieve our posts.
var allPosts = make(map[string]model.Post)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

func CreatePost(w http.ResponseWriter, r *http.Request) {
    var post model.Post
    // read content from request body into a new decoder
    decoder := json.NewDecoder(r.Body)
    // decode content into our Post struct
    err := decoder.Decode(&post)
    if err != nil {
        http.Error(w, "Failed to decode request body", http.StatusInternalServerError)
        return
    }
    // check for unique post title
    _, ok := allPosts[post.Title]
    if ok {
        http.Error(w, "Post title already exists", http.StatusBadRequest)
        return
    }

    // append post to our memory
    allPosts[post.Title] = post

    // prints out structs with field names
    fmt.Fprintf(w, "%+v", post)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

func ListPosts(w http.ResponseWriter, r *http.Request) {
    titles := []string{}

    for _, post := range allPosts {
        titles = append(titles, post.Title)
    }

    if len(titles) == 0 {
        http.Error(w, "no posts found", http.StatusNotFound)
    }

    json.NewEncoder(w).Encode(titles)
    // uncomment to print out structs with field names
    // fmt.Fprintf(w,"%+v",titles)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

func GetPostByTitle(w http.ResponseWriter, r *http.Request) {
    // retrieve title of post
    title := r.URL.Query().Get("title")
    if title == "" {
        http.Error(w, "Title is required", http.StatusBadRequest)
        return
    }

    // check title is present
    post, ok := allPosts[title]
    if !ok {
        http.Error(w, "Post not found", http.StatusNotFound)
        return

    }

    // encode the contents
    if err := json.NewEncoder(w).Encode(post); err != nil {
        http.Error(w, "Post not found", http.StatusInternalServerError)
        return
    }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

func UpdatePost(w http.ResponseWriter, r *http.Request) {
    // get title
    // check title is provided
    title := r.URL.Query().Get("title")
    if title == "" {
        http.Error(w, "Title is required", http.StatusBadRequest)
        return
    }

    // check if such post exists
    post, ok := allPosts[title]
    if !ok {
        http.Error(w, "BlogPost not found", http.StatusNotFound)
        return
    }
var updatedPost model.Post

    // read request body
    if err := json.NewDecoder(r.Body).Decode(&updatedPost); err != nil {
        http.Error(w, "Failed to decode request body", http.StatusBadRequest)
        return
    }

    // update post
    allPosts[title] = updatedPost
    post = updatedPost

    // return ok status
    w.WriteHeader(http.StatusOK)

    // return updated content
    json.NewEncoder(w).Encode(post)


}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

func DeletePost(w http.ResponseWriter, r *http.Request) {
    title := r.URL.Query().Get("title")

    // retrieve post
    _, ok := allPosts[title]
    if !ok {
        http.Error(w, "No post with such title", http.StatusNotFound)
    }
       // deletes the post from the map.
    delete(allPosts, title)

    w.WriteHeader(http.StatusOK)
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این توابع کنترل کننده منطق هر عملیات CRUD را مدیریت می کنند. آنها بدن درخواست (برای POST و PUT درخواست ها)، تعامل با پایگاه داده درون حافظه (allPosts) و بر این اساس پاسخ ها را ارسال کنید.

6. میان افزار (احراز هویت)

فایل: auth.go

package middleware

import "net/http"

func RequireAuth(f http.HandlerFunc) http.HandlerFunc {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // check if user is authenticated
        token := r.Header.Get("Authorization")
        if token != "Bearer Secret" {
            http.Error(w,"Unathorized", http.StatusUnauthorized)
            return
        }
        f.ServeHTTP(w,r)
    })
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تابع میان‌افزار یک سرصفحه مجوز معتبر را بررسی می‌کند. اگر توکن نیست Bearer Secret، یک پاسخ غیرمجاز برمی گرداند.

7. برنامه را اجرا کنید

دستورات زیر را برای مقداردهی اولیه و مرتب کردن وابستگی ها اجرا کنید:
اجرا کنید تا نصب کنید

cd your_project
go mod init your_project
go mod tidy
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

8. تست API ما

هنگامی که API راه اندازی و اجرا می شود، می توانید نقاط پایانی را با استفاده از دستورات curl آزمایش کنید.

سرور را اجرا کنید:

go run main.go
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با استفاده از curl

سپس، در پنجره ترمینال دیگر، استفاده کنید curl برای آزمایش:

curl -X POST -H "Content-Type: application/json" -d '{"title":"My First Post", "content":"This is the content.", "author":"John Doe"}' http://localhost:8080/create
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

curl -X GET 'http://localhost:8080/post?title=My%20First%20Post'

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

curl http://localhost:8080/list
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

curl -X PUT -H "Content-Type: application/json" -d '{"Title":"My First Post", "Content":"Updated content.", "Author":"John Doe"}' 'http://localhost:8080/edit?title=My%20Blog%20Post'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

curl -X DELETE -H "Authorization: Bearer Secret" 'http://localhost:8080/delete?title=My%20First%20Post'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با استفاده از Thunder Client

Thunder Client یک ابزار تست API سبک و قدرتمند است که معمولاً در کد ویژوال استودیو (VS Code) استفاده می شود. این یک رابط کاربر پسند برای ایجاد درخواست های API ارائه می دهد.

نحوه استفاده از Thunder Client برای درخواست های API را بررسی کنید: https://www.youtube.com/watch?v=c3sqFK7zBKE

نتیجه گیری

و شما آن را دارید – API RESTful خودتان برای مدیریت پست های وبلاگ، ساخته شده با قدرت Go! 🚀. از ایجاد پست تا به روز رسانی، حذف و مشاهده آنها.
اما صبر کنید — آیا می خواهید احراز هویت کاربر را اضافه کنید، داده ها را در یک پایگاه داده ذخیره کنید یا API خود را حتی مقیاس پذیرتر کنید؟ برو دنبالش! 🔥

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا