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

OSCHINA-MIRROR/mirrors-elton

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

Context

Запрос

http.Request объект, содержащий информацию о HTTP-запросе. Для получения дополнительной информации рекомендуется обратиться к официальной документации. Используйте этот объект только в том случае, если Context не предоставляет соответствующих методов или свойств.

Ответ

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

Завершен

Указывает, был ли ответ отправлен (коды состояния, данные и т.д. были записаны в ответ). Этот атрибут следует устанавливать только в случае необходимости отдельной обработки данных ответа.

ID

ID контекста. Если установлен Elton.GenerateID, то при каждом получении запроса и создании контекста вызывается GenerateID для генерации ID. Обычно используется для уникальной идентификации текущего запроса в логах или статистике.

Маршрут

Текущий маршрут.

Следующий

Функция next, которая автоматически создается при получении запроса. Не требует настройки. Если вы используете NewContext для тестирования, необходимо установить соответствующую функцию next.

ПараметрыОбъект параметров маршрута, предоставляющий методы для получения параметров маршрута. Непосредственное использование этого объекта не рекомендуется; лучше воспользоваться методом Param контекста для получения параметров.## Код состояния

Код состояния 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)
	}
}

RealIP

Получает реальный 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)
	}
}

ClientIP

Получает реальный 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)
	}
}

Param

Получает параметры маршрута.Пример

// 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)
	}
}

QueryParam

Получает значение параметра запроса, функция возвращает не массив строк, а только первый элемент массива. Если в запросе несколько значений с одинаковым ключом, то для получения всех значений используйте 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)
	}
}

Query

Получает строку запроса, этот метод возвращает объект запроса типа 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)
	}
}

Redirect

Перенаправляет текущий запрос.Пример

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/AddSignedCookie

Метод 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)
	}
}

БезКэшированияУстанавливает HTTP-заголовок ответа с значением 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 )

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

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