1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-elton

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Элтон

лицензия Статус сборки

Alt

Реализация Elton основана на koa и echo, вызов middleware организован по модели луковицы: запросы обрабатываются снаружи внутрь, а ответы — изнутри наружу. Основные характеристики включают:

  • Обработка функций (middleware) осуществляется путем возврата ошибки, что позволяет использовать единый middleware для обработки ошибок и преобразования их в соответствующий вывод (JSON), а также для генерации различных статистических данных в зависимости от типа ошибки.
  • Успешные ответы данных присваиваются к 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Пролог Начало работы с backend-разработкой началось с Node.js, а первым использованным фреймворком был Express. Позже я познакомился с другими фреймворками, но наиболее знакомым и удобным для меня остался Koa. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mirrors-elton.git
git@api.gitlife.ru:oschina-mirror/mirrors-elton.git
oschina-mirror
mirrors-elton
mirrors-elton
master