Onion: Мінімалістична обгортка для HTTP модуля Go

Розробка 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

Доступ до кінцевих точок:

  1. GET /books — Повертає список усіх книг.
  2. GET /books/1 — Повертає книгу з ID 1.
  3. 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

Leave a Reply

Your email address will not be published. Required fields are marked *