endpoint

package
v1.56.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 12, 2025 License: MIT Imports: 22 Imported by: 2

README

Package endpoint

Пакет endpoint предоставляет инструменты для создания HTTP-обработчиков с поддержкой middleware, валидации данных, логирования и метрик. Упрощает разработку API, автоматизируя рутинные задачи.

Types

Wrapper

Структура для создания оберток вокруг обработчиков. Объединяет:

  • Параметры функции (контекст, запрос, тело и т.д.).
  • Middleware (логирование, метрики, трейсинг).
  • Валидацию и сериализацию данных.

Methods:

NewWrapper(paramMappers []ParamMapper, bodyExtractor RequestBodyExtractor, bodyMapper ResponseBodyMapper, logger log.Logger) Wrapper

Конструктор обертки с указанными параметрами.

(m Wrapper) Endpoint(f any) http.HandlerFunc

Преобразовать функцию-обработчик в HTTP-обработчик.

(m Wrapper) WithMiddlewares(middlewares ...http2.Middleware) Wrapper

Билдер-метод для добавления middleware в обертку.

JsonRequestExtractor

Извлекает JSON из тела запроса и валидирует его с помощью объекта, реализующего интерфейс Validator.

Methods:

(j JsonRequestExtractor) Extract(ctx context.Context, reader io.Reader, reqBodyType reflect.Type) (reflect.Value, error)

Десериализовать JSON и проверить данные через Validator.

JsonResponseMapper

Сериализует ответ в JSON и добавляет заголовки.

Methods:

(j JsonResponseMapper) Map(ctx context.Context, result any, w http.ResponseWriter) error

Упаковка результата в JSON-ответ.

Caller

Структура Caller предоставляет механизм для вызова функций-обработчиков HTTP-запросов, автоматически преобразуя параметры запроса в аргументы функции. Интегрируется с валидацией, извлечением данных и middleware.

Methods:

NewCaller(f any, bodyExtractor RequestBodyExtractor, bodyMapper ResponseBodyMapper, paramMappers map[string]ParamMapper) (*Caller, error)

Создает экземпляр Caller для функции-обработчика.

(h *Caller) Handle(ctx context.Context, w http.ResponseWriter, r *http.Request) error

Вызывает функцию-обработчик, передавая ей аргументы, извлеченные из запроса.

Functions

DefaultWrapper(logger log.Logger, logMiddleware LogMiddleware, restMiddlewares ...http.Middleware) Wrapper

Создает предварительно настроенную обертку (Wrapper) для HTTP-обработчиков с базовыми middleware и параметрами. Упрощает создание эндпоинтов, включая валидацию, логирование, метрики и обработку ошибок "из коробки".

Стандартные Middleware:

  • MaxRequestBodySize – ограничивает размер тела запроса (по умолчанию 64 МБ).
  • RequestId – добавляет в контекст requestId, который берет из заголовка x-request-id. Генерирует новый, если не находит.
  • LogMiddleware – логирует данные запросов и ответов.
  • Metrics – собирает метрики: время выполнения, статус-коды, размеры тел.
  • Tracing – интеграция с трейсингом (OpenTelemetry).
  • ErrorHandler – перехватывает и обрабатывает ошибки. Ошибки типа HttpError возвращают структурированный ответ. Остальные ошибки логируются и возвращаются как 500 Internal Server Error.
  • Recovery – предотвращает падение сервера при панике в обработчике, преобразуя ее в ошибку.

Usage

Default usage flow
package main

import (
	"context"
	"log"

	"github.com/txix-open/isp-kit/http"
	"github.com/txix-open/isp-kit/http/endpoint"
	"github.com/txix-open/isp-kit/http/endpoint/httplog"
	"github.com/txix-open/isp-kit/http/router"
	log2 "github.com/txix-open/isp-kit/log"
	"github.com/txix-open/isp-kit/shutdown"
)

type userRequest struct {
	Name string
}

type userResponse struct {
	Id int
}

func foo(ctx context.Context, req userRequest) (userResponse, error) {
	/* put here some business logic */
	return userResponse{Id: 88}, nil
}

func main() {
	logger, err := log2.New()
	if err != nil {
		log.Fatal(err)
	}

	srv := http.NewServer(logger)

	wrapper := endpoint.DefaultWrapper(logger, httplog.Log(logger, true))
	r := router.New()
	r.POST("/foo", wrapper.Endpoint(foo))

	srv.Upgrade(r)

	shutdown.On(func() { /* waiting for SIGINT & SIGTERM signals */
		log.Println("shutting down...")
		_ = srv.Shutdown(context.Background())
		log.Println("shutdown completed")
	})

	err = srv.ListenAndServe(":8080")
	if err != nil {
		log.Fatal(err)
	}
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ErrorHandler

func ErrorHandler(logger log.Logger) http2.Middleware

func MaxRequestBodySize

func MaxRequestBodySize(maxBytes int64) http2.Middleware

func Metrics

func Metrics(storage *http_metrics.ServerStorage) http2.Middleware

func Recovery

func Recovery() http2.Middleware

func RequestId

func RequestId() http2.Middleware

Types

type Caller

type Caller struct {
	// contains filtered or unexported fields
}

func NewCaller

func NewCaller(
	f any,
	bodyExtractor RequestBodyExtractor,
	bodyMapper ResponseBodyMapper,
	paramMappers map[string]ParamMapper,
) (*Caller, error)

func (*Caller) Handle

func (h *Caller) Handle(ctx context.Context, w http.ResponseWriter, r *http.Request) error

type HttpError

type HttpError interface {
	WriteError(w http.ResponseWriter) error
}

type JsonRequestExtractor

type JsonRequestExtractor struct {
	Validator Validator
}

func (JsonRequestExtractor) Extract

func (j JsonRequestExtractor) Extract(ctx context.Context, reader io.Reader, reqBodyType reflect.Type) (reflect.Value, error)

type JsonResponseMapper

type JsonResponseMapper struct {
}

func (JsonResponseMapper) Map

type LogMiddleware added in v1.40.0

type LogMiddleware http2.Middleware

type ParamBuilder

type ParamBuilder func(ctx context.Context, w http.ResponseWriter, r *http.Request) (any, error)

type ParamMapper

type ParamMapper struct {
	Type    string
	Builder ParamBuilder
}

func ContextParam

func ContextParam() ParamMapper

func RequestParam

func RequestParam() ParamMapper

func ResponseWriterParam

func ResponseWriterParam() ParamMapper

type RequestBodyExtractor

type RequestBodyExtractor interface {
	Extract(ctx context.Context, reader io.Reader, reqBodyType reflect.Type) (reflect.Value, error)
}

type ResponseBodyMapper

type ResponseBodyMapper interface {
	Map(ctx context.Context, result any, w http.ResponseWriter) error
}

type Validator

type Validator interface {
	Validate(value any) (bool, map[string]string)
}

type Wrapper

type Wrapper struct {
	ParamMappers  map[string]ParamMapper
	BodyExtractor RequestBodyExtractor
	BodyMapper    ResponseBodyMapper
	Middlewares   []http2.Middleware
	Logger        log.Logger
}

func DefaultWrapper

func DefaultWrapper(logger log.Logger, logMiddleware LogMiddleware, restMiddlewares ...http.Middleware) Wrapper

func NewWrapper

func NewWrapper(
	paramMappers []ParamMapper,
	bodyExtractor RequestBodyExtractor,
	bodyMapper ResponseBodyMapper,
	logger log.Logger,
) Wrapper

func (Wrapper) Endpoint

func (m Wrapper) Endpoint(f any) http.HandlerFunc

func (Wrapper) WithMiddlewares

func (m Wrapper) WithMiddlewares(middlewares ...http2.Middleware) Wrapper

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL