پیاز: یک بسته بندی مینیمالیستی برای ماژول HTTP Go – انجمن DEV

توسعه API در Go اغلب ساده است، اما سادگی Go net/http
ماژول گاهی اوقات می تواند خیلی ابتدایی به نظر برسد. در حالی که علاقه مندان به Go عاشق رویکرد خام و بدون نظر هستند، داشتن کمی ساختار برای ساده سازی توسعه API می تواند خوب باشد.
آنجاست پیاز پیاز سبک وزن است لفاف برای برو net/http
ماژول سعی نمی کند یک چارچوب تمام عیار باشد. درعوض، به گونهای طراحی شده است که ماژول HTTP Go را با افزودن چند ویژگی با کیفیت زندگی مانند مسیریابی، میانافزار و ابزارهای پاسخ، کمی بصریتر و سرگرمکنندهتر کند.
چرا یک Wrapper، نه یک چارچوب؟
پیاز در مورد دیکته کردن نحوه ساختار برنامه یا ارائه یک راه حل مناسب برای همه مانند فریمورک های بزرگتر (مثلاً Gin یا Echo) نیست. در عوض، آن را افزایش می دهد net/http
ماژول، به شما اجازه می دهد:
- تعاریف مسیر را ساده کنید.
- میان افزار قابل استفاده مجدد را اضافه کنید.
- JSON و پارامترهای مسیر را راحت تر مدیریت کنید.
- کد خود را سبک وزن و نزدیک به اصطلاحات Go نگه دارید.
به طور خلاصه، Onion به فلسفه سادگی Go وفادار می ماند و در عین حال به شما کمک می کند تا کد دیگ بخار را کاهش دهید.
Code Walkthrough: ساختن یک API با Onion
بیایید ببینیم که Onion با ساخت یک API ساده کتاب چگونه کار می کند. ما به یک ساختار اساسی با دو فایل پایبند خواهیم بود: main.go
برای راه اندازی و books.go
برای مدیریت مسیر
main.go
این فایل برنامه Onion را مقداردهی اولیه می کند، میان افزار اضافه می کند، مسیرها را نقشه برداری می کند و سرور را راه اندازی می کند.
package main
import (
"fmt"
"github.com/saeedalam/Onion"
"example/books"
)
func main() {
// Create a new Onion app
app := onion.New()
// Map routes from the books module
app.MapRoutes(books.Routes)
// Custom 404 handler
app.NotFoundHandler(func(c *onion.Context) {
c.String(404, "Oops! Page not found.")
})
// Start the server on port 8080
app.Run(":8080")
}
books.go
این فایل مسیرها و کنترل کننده هایی را برای مدیریت کتاب ها تعریف می کند.
package books
import (
"net/http"
"github.com/saeedalam/Onion"
)
var books = []map[string]string{
{"id": "1", "title": "The Go Programming Language", "author": "Alan Donovan"},
{"id": "2", "title": "Go in Action", "author": "William Kennedy"},
}
// GetBooks handles GET /books and returns a list of books
func GetBooks(c *onion.Context) {
c.JSON(http.StatusOK, books)
}
// GetBookByID handles GET /books/:id and returns a specific book by ID
func GetBookByID(c *onion.Context) {
id := c.Param("id")
for _, book := range books {
if book["id"] == id {
c.JSON(http.StatusOK, book)
return
}
}
c.String(http.StatusNotFound, "Book not found")
}
// Routes is a slice of routes for the books module
var Routes = []onion.Route{
{Method: "GET", Pattern: "/books", Handler: GetBooks},
{Method: "GET", Pattern: "/books/:id", Handler: GetBookByID},
}
اجرای API
با فایل های بالا می توانید برنامه خود را اجرا کنید:
go run main.go
دسترسی به نقاط پایانی:
-
GET /books
– فهرستی از همه کتاب ها را برمی گرداند. -
GET /books/1
– کتاب را با شناسه 1 برمی گرداند. -
GET /books/:id
– اگر کتاب وجود نداشته باشد، 404 را برمیگرداند.
چرا از پیاز استفاده کنیم؟
پیاز آن را ساده نگه می دارد:
-
سبک وزن: بدون وابستگی شدید یا مهندسی بیش از حد – فقط یک بسته بندی منظم در اطراف
net/http
. -
شهودی: اگه میدونی
net/http
، شما قبلا پیاز را می شناسید. این ویژگی های بومی Go را پنهان نمی کند. - راحت: صفحه دیگ را برای مسیریابی، میان افزار و پاسخ ها کاهش می دهد.
می خواهید آن را بهتر کنید؟
پیاز تازه شروع کار است. این یک پروژه سرگرم کننده است که توسعه HTTP با Go را کمی لذت بخش تر می کند. جا برای پیشرفت وجود دارد و اگر علاقه مند به مشارکت هستید، در اینجا چند ایده وجود دارد:
- تجزیه بدن JSON را اضافه کنید.
- میان افزار را با ویژگی هایی مانند اتصال کوتاه تقویت کنید.
- از تطبیق مسیر پیشرفته تر پشتیبانی کنید.
از مخزن Onion GitHub دیدن کنید تا کد را بررسی کنید، مشکلی را ثبت کنید، یا یک درخواست کشش ارائه دهید. با هم، می توانیم پیاز را حتی تمیزتر کنیم!
پیاز در مورد جایگزین کردن چارچوب نیست. این در مورد ساخت Go's است net/http
کار کردن با آن کمی لذت بخش تر است. اگر با Go شروع میکنید یا یک نمونه اولیه سریع میسازید، Onion را امتحان کنید. این یک لفاف سبک وزن است که به شما کمک می کند در عین ساده نگه داشتن پایه کد، بهره ور بمانید.