Розробка API в Go зазвичай проста, але інколи мінімалізм модуля Go net/http
може здатися занадто базовим. У той час як прихильники Go люблять прямолінійний, без додаткових заборон, підхід, інколи хочеться мати більше структури для спрощення розробки API.
Ось тут і з'являється Onion. Onion — це легкий обгортковий модуль для модуля net/http
в Go. Він не намагається стати повноцінним фреймворком; натомість він покращує можливості HTTP модуля Go, додаючи кілька корисних функцій для спрощення роботи, таких як маршрутизація, проміжне програмне забезпечення (middleware) і утиліти для роботи з відповідями.
Чому обгортка, а не фреймворк?
Onion не нав'язує, як повинна бути структурована ваша програма, і не надає універсальне рішення, як більші фреймворки (наприклад, Gin або Echo). Натомість він покращує модуль net/http
, даючи вам змогу:
- Спрощувати визначення маршрутів.
- Додавати багаторазові проміжні програми (middleware).
- Зручніше обробляти JSON та параметри в URL.
- Залишати код легким і наближеним до ідіом Go.
Коротко кажучи, Onion зберігає простоту Go, допомагаючи вам зменшити обсяг шаблонного коду.
Огляд коду: Розробка API з Onion
Давайте подивимось, як працює Onion, розробляючи простий API для книг. Ми використовуватимемо базову структуру з двома файлами: main.go
для налаштування і books.go
для обробки маршрутів.
main.go
Цей файл ініціалізує додаток Onion, додає проміжне програмне забезпечення (middleware), визначає маршрути та запускає сервер.
package main
import (
"fmt"
"github.com/saeedalam/Onion"
"example/books"
)func main() {
// Створення нового додатку Onion
app := onion.New() // Додавання глобального логування
app.Use(func(c *onion.Context) {
fmt.Printf("[Request] %s %s\n", c.Request.Method, c.Request.URL.Path)
}) // Визначення маршрутів з модуля books
app.MapRoutes(books.Routes) // Користувацький обробник для 404
app.NotFoundHandler(func(c *onion.Context) {
c.String(404, "Ой! Сторінку не знайдено.")
}) // Запуск сервера на порту 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 обробляє GET /books і повертає список книг
func GetBooks(c *onion.Context) {
c.JSON(http.StatusOK, books)
}// GetBookByID обробляє GET /books/:id і повертає конкретну книгу за 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, "Книга не знайдена")
}// Routes — це масив маршрутів для модуля books
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
— Повертає книгу з ID 1.GET /books/:id
— Повертає 404, якщо книга не існує.
Чому варто використовувати Onion?
Onion зберігає все просто:
- Легкий: Без важких залежностей та надмірної складності — просто акуратна обгортка для
net/http
. - Інтуїтивно зрозумілий: Якщо ви знайомі з
net/http
, то ви вже знаєте Onion. Він не приховує можливості Go. - Зручний: Зменшує шаблонний код для маршрутизації, проміжного програмного забезпечення (middleware) та обробки відповідей.
Хочете зробити це краще?
Onion — це тільки початок. Це веселий проект, який допомагає зробити розробку HTTP з Go трошки приємнішою.
Є можливість для покращень, і якщо ви хочете долучитися до розробки, ось кілька ідей:
- Додати парсинг JSON тіла запиту.
- Покращити проміжне програмне забезпечення (middleware) за допомогою функцій, як-от коротке замикання (short-circuiting).
- Підтримка більш складного матчінгу маршрутів.
Завітайте до репозиторію Onion на GitHub, щоб ознайомитися з кодом, подати проблему або зробити pull request. Разом ми зробимо Onion ще акуратнішим!
Onion не має на меті замінити фреймворки; він призначений для того, щоб зробити роботу з Go net/http
трошки приємнішою. Якщо ви тільки починаєте працювати з Go або будуєте швидкий прототип, спробуйте Onion. Це легка обгортка, яка допомагає залишатися продуктивним, не ускладнюючи кодову базу.
Перекладено з: Onion: A Minimalist Wrapper for Go’s HTTP Module