description |
---|
Описание методов для примера elton |
Создает новый экземпляр elton и инициализирует соответствующий http.Server.
Пример
package main
import (
"github.com/vicanso/elton"
)
func main() {
e := elton.New()
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Создает новый экземпляр 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)
}
}
Пользовательский обработчик ошибок, который вызывается, если в процессе обработки маршрута возвращается ошибка. Если этот обработчик не указан, используется стандартный обработчик, который просто выводит 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)
}
}
Этот обработчик вызывается, когда 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
сервера HTTP для предоставления HTTP-сервиса.
Пример
package main
import (
"github.com/vicanso/elton"
)
func main() {
e := elton.New()
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Устанавливает адрес прослушивания и вызывает 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)
}
}
Добавляет глобальный промежуточный обработчик, который вызывается для всех запросов (включая запросы без соответствующего маршрута), обычно используется для предварительной обработки 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)
}
}
Добавляет все маршруты группы в 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)
}
}
Добавляет функцию обработки ошибок, которая срабатывает, если любой обработчик возвращает ошибку и другие обработчики не обрабатывают эту ошибку (рекомендуется использовать специальный промежуточный обработчик для обработки ошибок). Рекомендуется использовать эту функцию для мониторинга нераспознанных исключений.
Пример
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 )