description |
---|
Описание методов Context |
http.Request объект, содержащий информацию о HTTP-запросе. Для получения дополнительной информации рекомендуется обратиться к официальной документации. Используйте этот объект только в том случае, если Context не предоставляет соответствующих методов или свойств.
http.ResponseWriter, используется для установки HTTP-ответа, включая коды состояния, заголовки и данные ответа. В контексте есть различные функции для работы с этим объектом, обычно прямое изменение этого объекта не требуется.
Указывает, был ли ответ отправлен (коды состояния, данные и т.д. были записаны в ответ). Этот атрибут следует устанавливать только в случае необходимости отдельной обработки данных ответа.
ID контекста. Если установлен Elton.GenerateID, то при каждом получении запроса и создании контекста вызывается GenerateID
для генерации ID. Обычно используется для уникальной идентификации текущего запроса в логах или статистике.
Текущий маршрут.
Функция next, которая автоматически создается при получении запроса. Не требует настройки. Если вы используете NewContext для тестирования, необходимо установить соответствующую функцию next.
Код состояния HTTP-ответа, используемый для установки кода состояния HTTP-ответа.
Тело ответа HTTP. Это свойство имеет тип interface{}, поэтому его можно использовать для установки различных типов данных (аналогично Koa). Обратите внимание: после установки тела ответа необходимо использовать промежуточное ПО responder
для преобразования этого свойства в байты и установки соответствующего Content-Type
. Промежуточное ПО responder
преобразует различные структуры данных в JSON. Для конкретной реализации можно обратиться к исходному коду или реализовать соответствующее промежуточное ПО самостоятельно.
Тело ответа HTTP (в байтах). Это реальное тело ответа, которое возвращается. В большинстве случаев для преобразования тела ответа в байты и установки соответствующего Content-Type
используется промежуточное ПО responder
. В некоторых случаях можно напрямую установить тело ответа без использования промежуточного ПО.
Тело запроса HTTP. Для запросов с методами POST
, PUT
и PATCH
, этот атрибут используется для сохранения тела запроса. Обратите внимание: по умолчанию Elton не читает тело запроса из запроса. Для получения тела запроса необходимо использовать промежуточное ПО body_parser
или создать собственное промежуточное ПО.## Адрес удаленного хоста
Адрес IP клиента, отправившего запрос. Получает прямое подключение к клиенту, а не из заголовков запроса.
Пример
package main
import (
"log"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
log.Println(c.RemoteAddr())
c.Body = "Привет, мир!"
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Получает реальный IP-адрес клиента, сначала проверяется наличие заголовка X-Forwarded-For
, если его нет, то проверяется X-Real-IP
, если и этот заголовок отсутствует, то берется IP-адрес соединения.
Пример
package main
import (
"log"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
log.Println(c.RealIP())
c.Body = "Привет, мир!"
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Получает реальный IP-адрес клиента, способ получения аналогичен RealIP
, но при получении IP-адреса проверяется, является ли он публичным. Если IP-адрес не публичный, то продолжается поиск следующего подходящего IP-адреса.
Пример
package main
import (
"log"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
log.Println(c.ClientIP())
c.Body = "Привет, мир!"
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Получает параметры маршрута.Пример
// curl http://127.0.0.1:3000/users/me
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/users/{type}", func(c *elton.Context) (err error) {
c.Body = c.Param("type")
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Получает значение параметра запроса, функция возвращает не массив строк, а только первый элемент массива. Если в запросе несколько значений с одинаковым ключом, то для получения всех значений используйте Request.URL.Query()
.
Пример
// curl http://127.0.0.1:3000/?type=vip&count=10
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.Body = c.Query()
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Получает строку запроса, этот метод возвращает объект запроса типа map[string]string
, что отличается от исходного map[string][]string
. Поскольку использование одного и того же ключа редко встречается, этот метод добавлен для удобства использования. Если вам нужно использовать одинаковые ключи, используйте Request.URL.Query()
для получения.
Пример
// curl http://127.0.0.1:3000/?type=vip&count=10
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.Body = c.Query()
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Перенаправляет текущий запрос.Пример
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.Body = "Привет, Мир!"
return
})
e.GET("/redirect", func(c *elton.Context) (err error) {
err = c.Redirect(301, "/")
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Устанавливает сохраненное значение в контексте, которое остается в силе на протяжении всего жизненного цикла контекста. Метод Get
позволяет получить сохраненное значение. Также есть методы для быстрого получения различных типов данных, которые преобразуют сохраненные данные в соответствующий тип и возвращают их. Если данные не существуют или типы не совпадают, возвращаются значения по умолчанию. Поддерживаемые методы: GetInt
, GetInt64
, GetString
, GetBool
, GetFloat32
, GetFloat64
, GetTime
, GetDuration
, GetStringSlice
.
Пример
package main
import (
"math/rand"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.Use(func(c *elton.Context) error {
c.Set("id", rand.Int())
return c.Next()
})
e.GET("/", func(c *elton.Context) (err error) {
value, _ := c.Get("id")
c.Body = value
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Получение соответствующего значения из HTTP-заголовка запроса.
Пример
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.Body = c.GetRequestHeader("User-Agent")
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
```## Установка заголовка запроса
Установка значения HTTP-заголовка запроса. Если значение уже существует, оно будет заменено.
**Пример**
```go
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.SetRequestHeader("User-Agent", "go-agent")
c.Body = c.GetRequestHeader("User-Agent")
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Добавление значения HTTP-заголовка запроса. Это не заменяет существующее значение, а добавляет новое.
Пример
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.AddRequestHeader("User-Agent", "go-agent")
c.Body = c.Request.Header
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Получение контекста запроса.
Установка запроса с контекстом.
Возврат HTTP-заголовка ответа.
Пример
package main
import (
"math/rand"
"strconv"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.SetHeader("X-Response-Id", strconv.Itoa(rand.Int()))
c.Body = c.Header()
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Получение соответствующего значения из HTTP-заголовка ответа.
Пример
package main
import (
"math/rand"
"strconv"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
``````go
package main
import (
"math/rand"
"strconv"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.SetHeader("X-Response-Id", strconv.Itoa(rand.Int()))
c.Body = c.GetHeader("X-Response-Id")
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Устанавливает значение HTTP-заголовка ответа. Если значение уже существует, оно будет перезаписано.
Пример
package main
import (
"math/rand"
"strconv"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.SetHeader("X-Response-Id", strconv.Itoa(rand.Int()))
c.Body = c.GetHeader("X-Response-Id")
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Добавляет значение HTTP-заголовка ответа. Если значение уже существует, оно не будет перезаписано, а будет добавлено.
Пример
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.AddHeader("X-Response-Id", "1")
c.AddHeader("X-Response-Id", "2")
c.Body = c.Header()
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Объединяет HTTP-заголовки ответа.
Пример
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
h := make(http.Header)
h.Add("X-Response-Id", "1")
h.Add("X-Response-Id", "2")
c.MergeHeader(h)
c.Body = c.Header()
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Сбрасывает все значения HTTP-заголовков ответа.
Пример
package main
``````md
## Cookie/AddCookie
Метод Cookie получает cookie из HTTP-заголовка запроса, а метод AddCookie добавляет cookie в HTTP-заголовок ответа.
**Пример**
```go
package main
import (
"math/rand"
"net/http"
"strconv"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
cookie, _ := c.Cookie("jt")
if cookie == nil {
_ = c.AddCookie(&http.Cookie{
Name: "jt",
Value: strconv.Itoa(rand.Int()),
})
}
c.Body = cookie
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Метод SignedCookie проверяет соответствие cookie и sig cookie на основе ключей, заданных при инициализации Elton. Если соответствует, возвращает cookie. Метод AddSignedCookie генерирует проверенный cookie (Name — текущее имя Cookie + ".sig") на основе текущего cookie и ключей, заданных при инициализации Elton.
Пример
package main
import (
"math/rand"
"net/http"
"strconv"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.SignedKeys = new(elton.RWMutexSignedKeys)
e.SignedKeys.SetKeys([]string{
"secret key",
})
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
cookie, _ := c.SignedCookie("jt")
if cookie == nil {
_ = c.AddSignedCookie(&http.Cookie{
Name: "jt",
Value: strconv.Itoa(rand.Int()),
})
}
c.Body = cookie
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Чтение файла и отправка ответа. При получении файла генерируется `Last-Modified` на основе времени изменения файла, а также устанавливаются `Content-Length` и `Content-Type`. Данные отправляются в виде потока.
**Пример**
```go
package main
import (
"math/rand"
"net/http"
"strconv"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
return c.SendFile("index.html")
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Устанавливает HTTP-запросу статус-код 204, при этом тело ответа остается пустым.
Пример
// curl 'http://127.0.0.1:3000/' -v
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.NoContent()
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Устанавливает HTTP-заголовок ответа со значением 304, при этом тело ответа остается пустым. Обратите внимание, что этот метод используется для проверки соответствия кэшированных данных клиента и данных, полученных от сервера. Рекомендуется использовать middleware fresh
для обработки.
Пример
// curl 'http://127.0.0.1:3000/' -v
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.NotModified()
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Cache-Control: no-cache
. Рекомендуется использовать глобальное middleware для установки значения no-cache
для всех запросов. Для маршрутов, требующих изменения, можно отдельно установить значение в обработчиках.Пример
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.Use(func(c *elton.Context) error {
c.NoCache()
return c.Next()
})
e.GET("/", func(c *elton.Context) (err error) {
c.Body = "Привет, Мир!"
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Устанавливает HTTP-заголовок ответа с значением Cache-Control: no-store
. Используется для запросов, которые не должны сохраняться на клиенте, например, для одноразовых запросов, таких как вводы CAPTCHA.
Пример
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.NoStore()
c.Body = "Привет, Мир!"
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Устанавливает HTTP-заголовок ответа с значением Cache-Control: public, max-age=x, s-maxage=y
. Поддерживает динамическое задание значений, где первый параметр — это max-age
, а второй параметр — это s-maxage
.
Пример
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.CacheMaxAge(time.Minute, 10 * time.Second)
c.Body = "Привет, Мир!"
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Устанавливает код ответа HTTP в 201 и задает тело ответа, что эквивалентно вызову c.StatusCode = 201; c.Body = x;
.
Пример
// curl -XPOST 'http://127.0.0.1:3000/' -v
package main
``````markdown
## УстановкаContentTypeByExt
Устанавливает тип контента по расширению файла.
**Пример**
```go
package main
import (
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
c.SetContentTypeByExt(".html")
c.Body = `<html>
<body>
<p>Hello, World!</p>
</body>
</html>`
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Запрещает переиспользование контекста, если контекст используется после выполнения всех обработчиков (например, если установлено превышение времени ожидания, но невозможно прервать текущий обработчик, тогда контекст все еще используется). Если необходимо, вызовите эту функцию для запрета переиспользования контекста, если это не требуется, не запрещайте переиспользование.
Пример
package main
import (
"fmt"
"time"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
go func() {
time.Sleep(time.Second)
fmt.Println(c)
}()
c.DisableReuse()
c.Body = "Hello, World!"
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Передает текущий контекст обработки другому экземпляру Elton, устанавливает Committed в true, все обработчики этого экземпляра больше не используются для обработки этого контекста.
Передаёт текущий Reader в Response, используется для потокового вывода данных ответа, что экономит использование памяти.
**Пример**
```go
package main
import (
"bytes"
"github.com/vicanso/elton"
"github.com/vicanso/elton/middleware"
)
func main() {
e := elton.New()
e.Use(middleware.NewDefaultResponder())
e.GET("/", func(c *elton.Context) (err error) {
buf := new(bytes.Buffer)
for i := 0; i < 1000; i++ {
buf.WriteString("Привет, Мир!\n")
}
_, _ = c.Pipe(buf)
return
})
err := e.ListenAndServe(":3000")
if err != nil {
panic(err)
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )