Реализация Elton основана на koa и echo, вызов middleware организован по модели луковицы: запросы обрабатываются снаружи внутрь, а ответы — изнутри наружу. Основные характеристики включают:
Context.Body
(interface{}), а затем преобразуются в соответствующий вывод (JSON, XML) с помощью единого middleware для ответов.OnBefore
, OnDone
, OnError
и т.д., что позволяет легко добавлять различные статистические действия.Как использовать elton
для разработки веб-сервера, можно посмотреть в руководстве по использованию elton
Давайте рассмотрим, как использовать elton
для возврата строки "Привет, мир!" и добавления некоторых часто используемых middleware.```go
package main
import ( "github.com/vicanso/elton" "github.com/vicanso/elton/middleware" )
func main() { e := elton.New()
// Обработка паники
e.Use(middleware.NewRecover())
// Обработка ошибок
e.Use(middleware.NewDefaultError())
// Парсинг входных данных запроса
e.Use(middleware.NewDefaultBodyParser())
// Обработка неизмененных запросов 304
e.Use(middleware.NewDefaultFresh())
e.Use(middleware.NewDefaultETag())
// Преобразование данных ответа в JSON
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) error {
c.Body = &struct {
Message string `json:"message,omitempty"`
}{
"Привет, мир!",
}
return nil
})
e.GET("/books/{id}", func(c *elton.Context) error {
c.Body = &struct {
ID string `json:"id,omitempty"`
}{
c.Param("id"),
}
return nil
})
e.POST("/login", func(c *elton.Context) error {
c.SetContentTypeByExt(".json")
c.Body = c.RequestBody
return nil
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
go run main.go
```
После этого откройте браузер и перейдите по адресу `http://localhost:3000/`, чтобы увидеть отображаемое сообщение "Привет, мир!".
## Маршрутизация
Каждый маршрут в elton может иметь несколько промежуточных обработчиков, которые определяются маршрутом и методом HTTP-запроса. Глобальные промежуточные обработчики можно добавить с помощью метода `Use`.
```go
e.Use(...func(*elton.Context) error)
e.Method(path string, ...func(*elton.Context) error)
```
- `e` — это экземпляр объекта `elton`
- `Method` — метод HTTP-запроса, например: `GET`, `PUT`, `POST` и т.д.
- `path` — путь маршрута HTTP
- `func(*elton.Context) error` — обработчик маршрута (промежуточный обработчик), который вызывается при соответствующем запросе маршрута### Примеры маршрутов
Маршрутизация в elton основана на упрощении маршрутизации из библиотеки [chi](https://github.com/go-chi/chi). Ниже приведены два простых примера.
```go
// Маршрут с параметрами
e.GET("/users/{type}", func(c *elton.Context) error {
c.BodyBuffer = bytes.NewBufferString(c.Param("type"))
return nil
})
// Комбинированные параметры
e.GET("/books/{category:[a-z-]+}-{type}", func(c *elton.Context) error {
c.BodyBuffer = bytes.NewBufferString(c.Param("category") + c.Param("type"))
return nil
})
// Конфигурация маршрута с промежуточными обработчиками
e.GET("/users/me", func(c *elton.Context) error {
c.Set("account", "tree.xie")
return c.Next()
}, func(c *elton.Context) error {
c.BodyBuffer = bytes.NewBufferString(c.GetString("account"))
return nil
})
```
## Промежуточные обработчики
Простая и удобная система промежуточных обработчиков, которая позволяет легко и быстро реализовывать различные HTTP-сервисы с помощью различных промежуточных обработчиков. Важно отметить, что в elton по умолчанию не выполняются все промежуточные обработчики, каждый из которых решает, следует ли продолжать выполнение последующих обработчиков, вызывая функцию `Next()`. В отличие от gin, где по умолчанию выполняются все обработчики, если не требуется выполнить последующие обработчики, вызывается функция `Abort`.
### ОтветчикПри ответе на HTTP-запросы данные необходимо преобразовать в буфер, а при работе с данными обычно используются структуры данных, такие как `struct` или `map`. Поэтому в elton существует поле `Body(interface{})`, которое позволяет сохранять эти данные, а затем использовать пользовательские промежуточные обработчики для преобразования данных в соответствующие байтовые данные. Библиотека `elton-responder` преобразует `struct` или `map` в JSON-байты и устанавливает соответствующий `Content-Type`. Для строк или массивов байтов данные просто выводятся напрямую.
```go
package main
``````go
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
// Преобразование ответных данных c.Body в соответствующий JSON-ответ
e.Use(middleware.NewDefaultResponder())
getSession := func(c *elton.Context) error {
c.Set("account", "tree.xie")
return c.Next()
}
e.GET("/users/me", getSession, func(c *elton.Context) (err error) {
c.Body = &struct {
Name string `json:"name"`
Type string `json:"type"`
}{
c.GetString("account"),
"vip",
}
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
```
### Сообщение об ошибке
При неудачной обработке запроса можно просто вернуть ошибку, и elton извлечет информацию об ошибке и выведет её. По умолчанию обработка ошибок не подходит для реальных сценариев использования, рекомендуется использовать пользовательский класс ошибок в сочетании с middleware для унифицированной обработки ошибок и мониторинга программы. Ниже приведен пример использования middleware для преобразования ошибок в JSON-ответ.
```go
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
"github.com/vicanso/hes"
)
func main() {
e := elton.New()
// Указание на то, что ошибки должны возвращаться в формате JSON
e.Use(middleware.NewError(middleware.ErrorConfig{
ResponseType: "json",
}))
e.GET("/", func(c *elton.Context) (err error) {
err = &hes.Error{
StatusCode: 400,
Category: "users",
Message: "Произошла ошибка",
}
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
```
Дополнительные middleware можно найти в [документации](./docs/middlewares.md)
```## bench```
goos: darвин
goarch: amd64
pkg: github. com/vicanso/elton
BenchmarkRoutes-8 6925746 169. 4 ns/op 120 B/op 2 allocs/op
BenchmarkGetFunctionName-8 136577900 9. 265 ns/op 0 B/op 0 allocs/op
BenchmarkContextGet-8 15311328 78. 11 ns/op 16 B/op 1 allocs/op
BenchmarkContextNewMap-8 187684261 6. 276 ns/op 0 B/op 0 allocs/op
BenchmarkConvertServerTiming-8 1484379 835. 8 ns/op 360 B/op 11 allocs/op
BenchmarkGetStatus-8 1000000000 0. 2817 ns/op 0 B/op 0 allocs/op
BenchmarkFresh-8 955664 1233 ns/op 416 B/op 10 allocs/op
BenchmarkStatic-8 25128 46709 ns/op 20794 B/op 471 allocs/op
BenchmarkGitHubAPI-8 14724 76190 ns/op 27175 B/op 609 allocs/op
BenchmarkGplusAPI-8 326769 3659 ns/op 1717 B/op 39 allocs/op
BenchmarkParseAPI-8 162340 6989 ns/op 3435 B/op 78 allocs/op
BenchmarkRWMutexSignedKeys-8 71757390 17. 51 ns/op 0 B/op 0 allocs/op
BenchmarkAtomicSignedKeys-8 923771157 1. 297 ns/op 0 B/op 0 allocs/op
PASS
ok github. com/vicanso/elton 20. 225s
goos: darвин
goarch: amd64
pkg: github. com/vicanso/elton/middleware
BenchmarkGenETag-8 230718 4409 ns/op 160 B/op 6 allocs/op
BenchmarkMd5-8 200134 5958 ns/op 120 B/op 6 allocs/op
BenchmarkNewShortHTTPHeader-8 10220961 116. 4 ns/op 80 B/op 2 allocs/op
BenchmarkNewHTTPHeader-8 4368654 277. 1 ns/op 88 B/op 3 allocs/op
BenchmarkNewHTTPHeaders-8 384062 2822 ns/op 1182 B/op 23 allocs/op
BenchmarkHTTPHeaderMarshal-8 225123 4664 ns/op 1344 B/op 21 allocs/op
```BenchmarkToHTTPHeader-8 296210 3834 нс/оп 1272 Б/оп 34 аллоков/оп
BenchmarkHTTPHeaderUnmarshal-8 120136 10108 нс/оп 1888 Б/оп 50 аллоков/оп
BenchmarkProxy-8 13393 85170 нс/оп 16031 Б/оп 104 аллоков/оп
PASS
ok github.com/vicanso/elton/middleware 14.007с
```
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )