ساخت یک 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 خود را حتی مقیاس پذیرتر کنید؟ برو دنبالش! 🔥