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

OSCHINA-MIRROR/mirrors-elton

Клонировать/Скачать
application.md 17 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 04.06.2025 23:59 7f2703a
description
Описание методов для примера elton

Приложение

New

Создает новый экземпляр elton и инициализирует соответствующий http.Server.

Пример

package main

import (
	"github.com/vicanso/elton"
)

func main() {
	e := elton.New()
	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

NewWithoutServer

Создает новый экземпляр Elton без инициализации соответствующего http.Server, что полезно для сценариев, требующих настройки собственного http сервера, таких как различные настройки таймаута.

Пример

package main

import (
	"net/http"
	"time"

	"github.com/vicanso/elton"
)

func main() {
	e := elton.NewWithoutServer()
	s := &http.Server{
		Handler:      e,
		ReadTimeout:  5 * time.Second,
		WriteTimeout: 10 * time.Second,
	}
	e.Server = s
	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

ErrorHandler

Пользовательский обработчик ошибок, который вызывается, если в процессе обработки маршрута возвращается ошибка. Если этот обработчик не указан, используется стандартный обработчик, который просто выводит err.Error().

Если ошибка была обработана (например, обработчиком ошибок), то этот обработчик не будет вызван. Лучше использовать middleware для преобразования ошибок в соответствующие ответы (например, JSON), а этот обработчик используется для обработки непредвиденных ошибок.

Пример

package main

import (
	"log"
	"net/http"

	"github.com/vicanso/elton"
	"github.com/vicanso/hes"
)

func main() {
	e := elton.New()
``````markdown
	e.ErrorHandler = func(c *elton.Context, err error) {
		if err != nil {
			log.Printf("Необработанное исключение, url:%s, err:%v", c.Request.RequestURI, err)
		}
		he, ok := err.(*hes.Error)
		if ok {
			c.Response.WriteHeader(he.StatusCode)
			c.Response.Write([]byte(he.Message))
		} else {
			c.Response.WriteHeader(http.StatusInternalServerError)
			c.Response.Write([]byte(err.Error()))
		}
	}
``````md
## NotFoundHandler

Обработчик, вызываемый, если соответствующий маршрут не найден. Если маршрут не найден, то этот обработчик вызывается (все middleware также не вызываются). Если требуется статистика или пользовательский 404 страница, то этот обработчик можно настроить, в противном случае можно использовать стандартное поведение (возвращение 404 Not Found).

**Пример**
```go
package main

import (
	"log"
	"net/http"

	"github.com/vicanso/elton"
	"github.com/vicanso/hes"
)

func main() {
	e := elton.New()

	e.NotFoundHandler = func(resp http.ResponseWriter, req *http.Request) {
		// Можно добавить статистику для анализа, является ли 404-ошибка результатом атаки или ошибки вызова API
		log.Printf("404, url:%s", req.RequestURI)
		resp.WriteHeader(http.StatusNotFound)
		resp.Write([]byte("Custom not found"))
	}

	e.GET("/ping", func(c *elton.Context) (err error) {
		return hes.New("abcd")
	})
	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

MethodNotAllowedHandler

Этот обработчик вызывается, когда HTTP-запрос не разрешен (метод запроса не соответствует маршруту). Если требуется статистика или пользовательский ответ на 405, можно настроить этот обработчик. В противном случае можно использовать стандартное поведение (возвращение 405 Method Not Allowed).

Пример

package main

import (
	"log"
	"net/http"

	"github.com/vicanso/elton"
	"github.com/vicanso/hes"
)

func main() {
	e := elton.New()
``````markdown
	e.MethodNotAllowedHandler = func(resp http.ResponseWriter, req *http.Request) {
		// Можно добавить статистику для анализа, является ли 405-ошибка результатом атаки или ошибки вызова API
		log.Printf("405, method: %s, url:%s", req.Method, req.RequestURI)
		resp.WriteHeader(http.StatusMethodNotAllowed)
		resp.Write([]byte("Метод не разрешен"))
	}
``````markdown
# Генерация ID

Функция генерации ID, используемая для создания уникального ID для каждого запроса.

**Пример**
```go
package main

import (
	"log"
	"math/rand"
	"time"

	"github.com/oklog/ulid"
	"github.com/vicanso/elton"
	"github.com/vicanso/elton/middleware"
)

func main() {
	e := elton.New()

	e.GenerateID = func() string {
		t := time.Now()
		entropy := rand.New(rand.NewSource(t.UnixNano()))
		return ulid.MustNew(ulid.Timestamp(t), entropy).String()
	}

	e.Use(middleware.NewDefaultResponder())

	e.GET("/", func(c *elton.Context) (err error) {
		log.Println(c.ID)
		c.Body = c.ID
		return
	})
	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

Включение трассировки

При установке этого параметра в true включается трассировка вызовов, что позволяет отслеживать время выполнения каждого обработчика. Рекомендуется использовать имена для глобальных middleware.

Пример

package main

import (
	"log"

	"github.com/vicanso/elton"
	"github.com/vicanso/elton/middleware"
)

func main() {
	e := elton.New()

	e.EnableTrace = true
	e.OnTrace(func(c *elton.Context, traceInfos elton.TraceInfos) {
		log.Println(traceInfos[0])
		// Устанавливает HTTP-заголовок: Server-Timing
		c.ServerTiming(traceInfos, "elton-")
	})

	fn := middleware.NewDefaultResponder()
	// Устанавливает имя для этого middleware, если имя равно "-", то middleware игнорируется
	e.UseWithName(fn, "responder")

	e.GET("/", func(c *elton.Context) (err error) {
		c.Body = "Hello, World!"
		return
	})
	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

Подписанные ключи

Ключи для генерации подписанных cookies, основанные на keygrip для создания и проверки легальности. При получении cookie с помощью SignedCookie проверяется легальность cookie, а AddSignedCookie добавляет cookie и соответствующий sig cookie.

```go
package main

import (
	"bytes"
	"net/http"

	"github.com/vicanso/elton"
)

func main() {
	e := elton.New()

	e.SignedKeys = new(elton.RWMutexSignedKeys)
	// Ключи для подписи cookie
	e.SignedKeys.SetKeys([]string{
		"secret key",
	})

	e.GET("/", func(c *elton.Context) (err error) {
		cookie, _ := c.SignedCookie("jt")
		// Если cookie не существует
		if cookie == nil {
			// Устанавливает подписанный cookie
			err = c.AddSignedCookie(&http.Cookie{
				Name:  "jt",
				Value: "abcd",
			})
			if err != nil {
				return
			}
		}

		c.BodyBuffer = bytes.NewBufferString("Hello, World!")
		return
	})
	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

ListenAndServe

Устанавливает адрес прослушивания и вызывает ListenAndServe сервера HTTP для предоставления HTTP-сервиса.

Пример

package main

import (
	"github.com/vicanso/elton"
)

func main() {
	e := elton.New()
	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

ListenAndServeTLS

Устанавливает адрес прослушивания и вызывает ListenAndServeTLS сервера HTTP для предоставления HTTPS-сервиса.

Пример

package main

import (
	"github.com/vicanso/elton"
)

func main() {
    // Путь к зашифрованному сертификату
    certFile := "~/cert/cert"
    keyFile := "~/cert/key"
	e := elton.New()
	err := e.ListenAndServeTLS(":3000", certFile, keyFile)
	if err != nil {
		panic(err)
	}
}

Закрыть

Закрывает сервис, вызывая метод Close объекта http.Server.

Пример

package main

import (
	"time"

	"github.com/vicanso/elton"
)

func main() {
	e := elton.New()

	go func() {
		time.Sleep(5 * time.Second)
		e.Close()
	}()

	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

Грациозное_закрытиеГрациозное закрытие текущего сервиса, сначала устанавливает состояние экземпляра в StatusClosing, после чего все новые запросы будут завершаться с ошибкой. После истечения указанного времени вызывается метод Close объекта http.Server.Пример

package main

import (
	"time"

	"github.com/vicanso/elton"
)

func main() {
	e := elton.New()

	go func() {
		e.GracefulClose(10 * time.Second)
	}()

	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

Обработать

Добавляет обработчик для запросов, настраивает метод и путь запроса, добавляя соответствующие обработчики. Elton поддерживает методы GET, POST, PUT, PATCH, DELETE, HEAD, TRACE и OPTIONS. Метод Handle позволяет указать метод запроса, а также использовать ALL для поддержки всех HTTP методов.

Пример

package main

import (
	"github.com/vicanso/elton"
	"github.com/vicanso/elton/middleware"
)

func main() {
	e := elton.New()

	e.Use(middleware.NewDefaultResponder())

	noop := func(c *elton.Context) error {
		return c.Next()
	}

	e.Handle("GET", "/", noop, func(c *elton.Context) (err error) {
		c.Body = "Привет, Мир!"
		return
	})

	e.POST("/users/{type}", func(c *elton.Context) (err error) {
		c.Body = "OK"
		return
	})

	e.GET("/files/*", func(c *elton.Context) (err error) {
		c.Body = "содержимое файла"
		return
	})

	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

Использовать/Использовать_с_названиемДобавляет глобальные обработчики-промежуточные компоненты для всех маршрутов. Если промежуточный компонент требуется для всех маршрутов, используйте эту функцию для его добавления. Если промежуточный компонент требуется только для некоторых маршрутов, добавьте его к соответствующей группе или обработчику. Важно отметить, что для промежуточных компонентов, таких как сессии, которые требуют доступа к базе данных, не следует использовать глобальные промежуточные компоненты, если это не требуется. Функция UseWithName позволяет указать имя промежуточного компонента, которое используется для отслеживания времени выполнения.Пример

package main

import (
	"log"
	"time"

	"github.com/vicanso/elton"
	"github.com/vicanso/elton/middleware"
)
func main() {
	e := elton.New()

	// Записывает время HTTP-запроса, код ответа
	e.Use(func(c *elton.Context) (err error) {
		startedAt := time.Now()
		req := c.Request
		err = c.Next()
		log.Printf("%s %s %d use %s", req.Method, req.URL.RequestURI(), c.StatusCode, time.Since(startedAt).String())
		return err
	})

	e.UseWithName(middleware.NewDefaultResponder(), "responder")

	e.GET("/", func(c *elton.Context) (err error) {
		c.Body = "Привет, Мир!"
		return
	})

	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

Pre

Добавляет глобальный промежуточный обработчик, который вызывается для всех запросов (включая запросы без соответствующего маршрута), обычно используется для предварительной обработки URL, например, удаления префикса.

Пример

package main

import (
	"net/http"
	"strings"

	"github.com/vicanso/elton"
	"github.com/vicanso/elton/middleware"
)

func main() {
	e := elton.New()
	// Если URL начинается с /api, заменяем его
	urlPrefix := "/api"
	e.Pre(func(req *http.Request) {
		path := req.URL.Path
		if strings.HasPrefix(path, urlPrefix) {
			req.URL.Path = path[len(urlPrefix):]
		}
	})
	e.Use(middleware.NewDefaultResponder())

	e.GET("/", func(c *elton.Context) (err error) {
		c.Body = "Привет, Мир!"
		return
	})
	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

AddGroup

Добавляет все маршруты группы в Elton. Важно отметить, что при вызове AddGroup все маршруты в этой группе добавляются к экземпляру, поэтому любые изменения в группе после вызова AddGroup не будут учтены.

Пример

package main

import (
	"github.com/vicanso/elton"
	"github.com/vicanso/elton/middleware"
)

func main() {
	e := elton.New()
	e.Use(middleware.NewDefaultResponder())
	userGroup := elton.NewGroup("/users", func(c *elton.Context) error {
		return c.Next()
	})
	userGroup.GET("/me", func(c *elton.Context) error {
		c.Body = "nickname"
		return nil
	})
``````go
import (
	"errors"
	"log"

	"github.com/vicanso/elton"
	"github.com/vicanso/elton/middleware"
)

func main() {
	e := elton.New()

	e.AddGroup(userGroup)
	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

OnError

Добавляет функцию обработки ошибок, которая срабатывает, если любой обработчик возвращает ошибку и другие обработчики не обрабатывают эту ошибку (рекомендуется использовать специальный промежуточный обработчик для обработки ошибок). Рекомендуется использовать эту функцию для мониторинга нераспознанных исключений.

Пример

package main

import (
	"errors"
	"log"

	"github.com/vicanso/elton"
	"github.com/vicanso/elton/middleware"
)

func main() {
	e := elton.New()

	e.OnError(func(c *elton.Context, err error) {
		// Отправка уведомления по электронной почте и т.д.
		log.Println("ошибка: " + err.Error())
	})

	e.Use(middleware.NewDefaultResponder())

	e.GET("/", func(c *elton.Context) (err error) {
		c.Body = "Привет, Мир!"
		return
	})
	// Поскольку общего обработчика ошибок не установлено, эта ошибка вызовет событие
	// В реальном использовании необходимо добавить общий обработчик ошибок для обработки, событие ошибки используется только для мониторинга неожиданных ошибок
	e.GET("/error", func(c *elton.Context) (err error) {
		return errors.New("abcd")
	})
	err := e.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}

Опубликовать ( 0 )

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

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