跳到主要内容

Context

type Context

type Context interface {
// 返回当前请求的 `*http.Request` 结构体实例。
Request() *http.Request
// 设置 `*http.Request` 结构体实例。
SetRequest(r *http.Request)
// Response 返回 `slim.ResponseWriter`。
Response() ResponseWriter
// SetResponse 设置 `slim.ResponseWriter`。
SetResponse(r ResponseWriter)
// Filesystem 返回 `fs.FS`。
Filesystem() fs.FS
// SetFilesystem 设置 `fs.FS`
SetFilesystem(fs.FS)
// IsTLS 如果 HTTP 连接是 TLS 则返回 true,否则返回 false。
IsTLS() bool
// IsWebSocket 如果 HTTP 连接是 WebSocket 则返回 true,否则返回 false。
IsWebSocket() bool
// Scheme 返回 HTTP 协议方案,`http` 或 `https`。
Scheme() string
// RealIP 基于 `X-Forwarded-For` 或 `X-Real-IP` 请求报头返回客户端的网络地址。
// 可以使用 `Slim#IPExtractor` 配置其行为。
RealIP() string
RequestMethod() string
RequestURI() string
// Is 检查请求 Content-Type 是否匹配给定的类型
Is(types ...string) string
// Accepts 返回支持的权重最高的媒体类型,若匹配失败则会返回空字符串。
// 给出的值可以是标准的媒体类型(如 application/json),也可以是扩展名(如 json、xml 等)。
Accepts(expect ...string) string
// AcceptsEncodings 返回支持的权重最高的编码方式,若匹配失败则会返回空字符串。
AcceptsEncodings(encodings ...string) string
// AcceptsCharsets 返回支持的权重最高的字符集,若匹配失败则会返回空字符串。
AcceptsCharsets(charsets ...string) string
// AcceptsLanguages 返回支持的权重最高的语言,若匹配失败则会返回空字符串。
AcceptsLanguages(languages ...string) string
// AllowsMethods 返回允许的请求方法
AllowsMethods() []string
// 返回路由器匹配的结果
RouteMatchType() RouteMatchType
// RouteInfo 返回当前请求的路由信息。如果匹配到路由,则返回方法、路径、名称和参数。
// 在 404(未找到路由)和 405(不允许的方法)的情况下,RouteInfo 返回这些情况的通用结构体。
RouteInfo() RouteInfo
// PathParam 根据名称返回路径参数。
PathParam(name string) string
// PathParams 返回路径参数值。
PathParams() PathParams
// SetPathParams 在当前请求生命周期中设置路径参数。
SetPathParams(params PathParams)
// QueryParam 返回提供的名称的查询参数。
QueryParam(name string) string
// QueryParams 以 `url.Values` 形式返回查询参数。
QueryParams() url.Values
// QueryString 返回 URL 查询字符串。
QueryString() string
// FormValue 返回提供的名称的表单字段值。
FormValue(name string) string
// FormParams 以 `url.Values` 形式返回表单参数。
FormParams() (url.Values, error)
// FormFile 返回提供的名称的 multipart 表单文件。
FormFile(name string) (*multipart.FileHeader, error)
Header(key string) string
SetHeader(key string, values ...string)
// MultipartForm 返回 multipart 表单。
MultipartForm() (*multipart.Form, error)
// Cookie 返回请求中提供的指定名称的 cookie。
Cookie(name string) (*http.Cookie, error)
// SetCookie 在 HTTP 响应中添加 `Set-Cookie` 报头。
SetCookie(cookie *http.Cookie)
// Cookies 返回随请求发送的 HTTP cookies。
Cookies() []*http.Cookie
// Get 从上下文中检索数据。
Get(key string) any
// Set 在上下文中保存数据。
Set(key string, val any)
// Bind 将请求体绑定到提供的类型 `i`。默认绑定器
// 基于 Content-Type 报头执行此操作。
Bind(i any) error
// Validate 验证提供的 `i`。通常在 `Context#Bind()` 之后调用。
// 必须使用 `Slim#Validator` 注册验证器。
Validate(i any) error
// Written 返回上下文响应是否已被写入
Written() bool
// Render 使用数据渲染模板,并发送带有状态码的 text/html 响应。
// 必须使用 `Slim.Renderer` 注册渲染器。
Render(code int, name string, data any) error
// HTML 发送带有状态码的 HTTP 响应。
HTML(code int, html string) error
// HTMLBlob 发送带有状态码的 HTTP blob 响应。
HTMLBlob(code int, b []byte) error
// String 发送带有状态码的字符串响应。
String(code int, s string) error
// JSON 发送带有状态码的 JSON 响应。
JSON(code int, i any) error
// JSONPretty 发送带有状态码的格式化 JSON。
JSONPretty(code int, i any, indent string) error
// JSONBlob 发送带有状态码的 JSON blob 响应。
JSONBlob(code int, b []byte) error
// JSONP 发送带有状态码的 JSONP 响应。它使用 `callback` 来构造
// JSONP 负载。
JSONP(code int, callback string, i any) error
// JSONPBlob 发送带有状态码的 JSONP blob 响应。它使用 `callback`
// 来构造 JSONP 负载。
JSONPBlob(code int, callback string, b []byte) error
// XML 发送带有状态码的 XML 响应。
XML(code int, i any) error
// XMLPretty 发送带有状态码的格式化 XML。
XMLPretty(code int, i any, indent string) error
// XMLBlob 发送带有状态码的 XML blob 响应。
XMLBlob(code int, b []byte) error
// Blob 发送带有状态码和内容类型的 blob 响应。
Blob(code int, contentType string, b []byte) error
// Stream 发送带有状态码和内容类型的流式响应。
Stream(code int, contentType string, r io.Reader) error
// File 发送包含文件内容的响应。
File(file string, filesystem ...fs.FS) error
// Attachment 以附件形式发送响应,提示客户端保存文件。
Attachment(file string, name string) error
// Inline 以内联形式发送响应,在浏览器中打开文件。
Inline(file string, name string) error
// NoContent 发送不带正文和状态码的响应。
NoContent(code ...int) error
// Redirect 将请求重定向到提供的 URL,并返回状态码。
Redirect(code int, url string) error
// Error 调用已注册的 HTTP 错误处理器。
// 注意:避免使用此方法。最好返回错误,以便链中的中间件可以对返回的错误采取行动。
Error(err error)
// Slim 返回 Slim 实例
Slim() *Slim
}

接口 Context 是表示当前 HTTP 请求的上下文,它包含对请求和响应对象的引用、路径、路径参数、数据和匹配的路由信息。

type EditableContext

type EditableContext interface {
Context
// RawPathParams 返回原始路径参数值。
RawPathParams() *PathParams
// SetRawPathParams 在此上下文生命周期(请求)中用新值替换任何现有的参数值。
SetRawPathParams(params *PathParams)
// SetRouteMatchType 设置此请求的路由器匹配的 RouteMatchType。
SetRouteMatchType(t RouteMatchType)
SetAllowsMethods(methods []string)
// SetRouteInfo 将此请求的路由信息设置到上下文。
SetRouteInfo(ri RouteInfo)
// Reset 在请求完成后重置上下文。必须与 `Slim#AcquireContext()` 和 `Slim#ReleaseContext()` 一起调用。
// 参见 `Slim#ServeHTTP()`
Reset(w http.ResponseWriter, r *http.Request)
}

type PathParam

type PathParam struct {
Name string
Value string
}

路由参数单元结构体。

type PathParams

type PathParams []PathParam

func (PathParams) Get

func (p PathParams) Get(name string, defaultValue ...string) string

获取路参数,如果参数不存在,则使用给出的默认值,要是没有给出默认值,则返回空字符。

func (PathParams) Lookup

func (p PathParams) Lookup(name string) (string, bool)

获取路由参数,返回的第二个参数表示给出的名称是否存在。

type contextImpl

type contextImpl struct{}

默认上下文结构体,实现了 ContextEditableContext 这两个接口。

提示

contextImpl 嵌入了标准库的 context.Context 接口,通过 c.Request().Context() 实现。

func (*contextImpl) Request

func (c *contextImpl) Request() *http.Request

返回当前请求的 *http.Request 结构体实例。

func (*contextImpl) SetRequest

func (c *contextImpl) SetRequest(r *http.Request)

设置 *http.Request 结构体实例。

func (*contextImpl) Response

func (c *contextImpl) Response() ResponseWriter

返回 slim.ResponseWriter 接口的实现,包装了 http.ResponseWriter 实例,同时实现了 http.Flusherhttp.Pusher 两个接口。

func (*contextImpl) SetResponse

func (c *contextImpl) SetResponse(r ResponseWriter)

设置自定义 slim.ResponseWriter

func (*contextImpl) Filesystem

func (c *contextImpl) Filesystem() fs.FS

返回文件系统 fs.FS 接口。

func (*contextImpl) SetFilesystem

func (c *contextImpl) SetFilesystem(fs.FS)

设置文件系统 fs.FS 接口。

func (*contextImpl) IsTLS

func (c *contextImpl) IsTLS() bool

如果 HTTP 连接是 TLS 则返回 true,否则返回 false。

func (*contextImpl) IsWebSocket

func (c *contextImpl) IsWebSocket() bool

如果是 WebSocket 连接则返回 true,反之返回 false。

func (*contextImpl) Scheme

func (c *contextImpl) Scheme() string

返回 HTTP 协议方案,值是 httphttps

func (*contextImpl) RealIP

func (c *contextImpl) RealIP() string

基于报头 X-Forwarded-ForX-Real-IP 返回客户端的 IP 地址。

func (*contextImpl) RequestMethod

func (c *contextImpl) RequestMethod() string

返回请求方法。

func (*contextImpl) RequestURI

func (c *contextImpl) RequestURI() string

返回完整的请求地址字符串。

func (*contextImpl) Accepts

func (c *contextImpl) Accepts(expect ...string) string

返回支持的权重最高的媒体类型,若匹配失败则会返回空字符串。给出的参数 expect 的值可以是标准的媒体类型(如 application/json),也可以是扩展名(如 json、xml 等)。

具体逻辑参考接口 Negotiation

使用示例
// Accept: text/html
c.accepts("html")
// => "html"

// Accept: text/*, application/json
c.accepts("html")
// => "html"
c.accepts("text/html")
// => "text/html"
c.accepts("json", "text")
// => "json"
c.accepts("application/json")
// => "application/json"

// Accept: text/*, application/json
c.accepts("image/png")
c.accepts("png")
// => false

// Accept: text/*;q=.5, application/json
c.accepts("html", "json")
// => "json"

// No Accept header
c.accepts("html", "json")
// => ""
c.accepts("json", "html")
// => ""

某些情况下,需要根据内容协商做出不同的行为,我们可以使用 switch

使用示例
switch(c.accepts("json", "html", "text")) {
case "json":
case "html":
case "text":
default:
}

func (*contextImpl) AcceptsEncodings

func (c *contextImpl) AcceptsEncodings(encodings ...string) string

返回当前请求支持的权重最高的编码方式,若匹配失败则会返回空字符串。

使用示例
// Accept-Encoding: gzip
c.acceptsEncodings("gzip", "deflate", "identity")
// => "gzip"

func (*contextImpl) AcceptsCharsets

func (c *contextImpl) AcceptsCharsets(charsets ...string) string

返回支持的权重最高的字符集,若匹配失败则会返回空字符串。

使用示例
// Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5
c.acceptsCharsets("utf-8", "utf-7")
// => "utf-8"

func (*contextImpl) AcceptsLanguages

func (c *contextImpl) AcceptsLanguages(languages ...string) string

返回支持的权重最高的语言,若匹配失败则会返回空字符串。

使用示例
// Accept-Language: en;q=0.8, es, pt
c.acceptsLanguages("es", "en")
// => "es"

func (*contextImpl) AllowsMethods

func (c *contextImpl) AllowsMethods() []string

返回本次请求路径所支持的所有请求方法(包括与路径匹配的路由所支持的 HTTP 方法和不匹配的路由所支持的 HTTP 方法)。

func (*contextImpl) RouteMatchType

func (c *contextImpl) RouteMatchType() RouteMatchType

返回路由器匹配的结果,我们可以据此确定使用那种方式完成本次请求:

  • RouteMatchFound - 通过当前请求的路径和方法成功匹配到我们定义的路由;
  • RouteMatchNotFound - 没有与本次请求路径相匹配的路由;
  • RouteMatchMethodNotAllowed - 能够通过请求路径匹配到路由,但是该无法支持本次请求所使用的 HTTP 方法;
  • RouteMatchUnknown — 程序尚未开始执行匹配,表示上下文为初始状态。
提示

如果在通过方法 Slim#Use 注册在 Slim 实例上的中间件上调用当方法,返回的值极有可能是 RouteMatchUnknown, 那是因为此刻程序尚未对本次请求去匹配路由,只有等到请求逆序返回的时候才可能取到其它值。

参考 《快速上手》 理解什么是中间件。

func (*contextImpl) RouteInfo

func (c *contextImpl) RouteInfo() RouteInfo

返回当前请求的路由信息。

func (*contextImpl) PathParam

func (c *contextImpl) PathParam(name string) string

获取指定名称的路径参数值,如果不存在返回空字符串。

func (*contextImpl) PathParams

func (c *contextImpl) PathParams() PathParams

返回所以的路径参数。

func (*contextImpl) SetPathParams

func (c *contextImpl) SetPathParams(params PathParams)

set path parameter for during current request lifecycle.

func (*contextImpl) QueryParam

func (c *contextImpl) QueryParam(name string) string

返回指定名称的查询参数值,若不存在则返回空字符串。

func (*contextImpl) QueryParams

func (c *contextImpl) QueryParams() url.Values

使用 url.Values 结构体返回所有的查询参数。

func (*contextImpl) QueryString

func (c *contextImpl) QueryString() string

返回查询字符串。

func (*contextImpl) FormValue

func (c *contextImpl) FormValue(name string) string

返回指定名称的表单数据。

func (*contextImpl) FormParams()

func (c *contextImpl) FormParams() (url.Values, error)

使用 url.Values 结构体返回提交的所有表单数据。

func (*contextImpl) FormFile(name string)

func (c *contextImpl) FormFile(name string) (*multipart.FileHeader, error)

返回上传的文件。

func (*contextImpl) Header

func (c *contextImpl) Header(key string) string

返回名称为 key 的请求报头的值。

func (*contextImpl) SetHeader

func (c *contextImpl) SetHeader(key string, values ...string)

设置响应报头

func (*contextImpl) MultipartForm()

func (c *contextImpl) MultipartForm() (*multipart.Form, error)

返回上传的所以文件,第二个返回值表示解析文件失败。

func (*contextImpl) Cookie(name string)

func (c *contextImpl) Cookie(name string) (*http.Cookie, error)

返回请求中提供的指定名称的 cookie。

func (*contextImpl) SetCookie

func (c *contextImpl) SetCookie(cookie *http.Cookie)

在 HTTP 响应中添加 Set-Cookie 报头。

func (*contextImpl) Cookies

func (c *contextImpl) Cookies() []*http.Cookie

返回随请求发送的 HTTP cookies。

func (*contextImpl) Get

func (c *contextImpl) Get(key string) any

返回储存在上下文中的数据。

func (*contextImpl) Set

func (c *contextImpl) Set(key string, val any)

将一个值保存到上下文中。

func (*contextImpl) Bind

func (c *contextImpl) Bind(i any) error

将请求时提交的数据绑定到参数 i 上,主要来源如下:

  • 查询参数(Query String);
  • 请求体(通过 POST 等请求方法提交的)数据;
  • 匹配的路由参数;
  • 提交的报头值。

请求体通过报头 Content-Type 的值来识别,然后调用不同的序列化程序 Serializer 解构到参数 i 上。

func (*contextImpl) Validate

func (c *contextImpl) Validate(i any) error

验证提供的 i。通常在 Context#Bind() 之后调用。 必须使用 Slim#Validator 注册验证器。

func (*contextImpl) Written

func (c *contextImpl) Written() bool

返回上下文响应是否已被写入

func (*contextImpl) Render

func (c *contextImpl) Render(code int, name string, data any) error

使用数据渲染模板,并发送带有状态码的 text/html 响应。 必须使用 Slim.Renderer 注册渲染器。

func (*contextImpl) HTML

func (c *contextImpl) HTML(code int, html string) error

发送带有状态码的 HTTP 响应。

func (*contextImpl) HTMLBlob

func (c *contextImpl) HTMLBlob(code int, b []byte) error

发送带有状态码的 HTTP blob 响应。

func (*contextImpl) String

func (c *contextImpl) String(code int, s string) error

发送带有状态码的字符串响应。

func (*contextImpl) JSON

func (c *contextImpl) JSON(code int, i any) error

发送带有状态码的 JSON 响应。

func (*contextImpl) JSONPretty

func (c *contextImpl) JSONPretty(code int, i any, indent string) error

发送带有状态码的格式化 JSON。

func (*contextImpl) JSONBlob

func (c *contextImpl) JSONBlob(code int, b []byte) error

发送带有状态码的 JSON blob 响应。

func (*contextImpl) JSONP

func (c *contextImpl) JSONP(code int, callback string, i any) error

发送带有状态码的 JSONP 响应。它使用 callback 来构造 JSONP 负载。

func (*contextImpl) JSONPBlob

func (c *contextImpl) JSONPBlob(code int, callback string, b []byte) error

发送带有状态码的 JSONP blob 响应。它使用 callback 来构造 JSONP 负载。

func (*contextImpl) XML

func (c *contextImpl) XML(code int, i any) error

发送带有状态码的 XML 响应。

func (*contextImpl) XMLPretty

func (c *contextImpl) XMLPretty(code int, i any, indent string) error

发送带有状态码的格式化 XML。

func (*contextImpl) XMLBlob

func (c *contextImpl) XMLBlob(code int, b []byte) error

发送带有状态码的 XML blob 响应。

func (*contextImpl) Blob

func (c *contextImpl) Blob(code int, contentType string, b []byte) error

发送带有状态码和内容类型的 blob 响应。

func (*contextImpl) Stream

func (c *contextImpl) Stream(code int, contentType string, r io.Reader) error

发送带有状态码和内容类型的流式响应。

func (*contextImpl) File

func (c *contextImpl) File(file string, filesystem ...fs.FS) error

发送包含文件内容的响应。

func (*contextImpl) Attachment

func (c *contextImpl) Attachment(file string, name string) error

以附件形式发送响应,提示客户端保存文件。

func (*contextImpl) Inline

func (c *contextImpl) Inline(file string, name string) error

以内联形式发送响应,在浏览器中打开文件。

func (*contextImpl) NoContent

func (c *contextImpl) NoContent(code ...int) error

发送不带正文和状态码的响应。

func (*contextImpl) Redirect

func (c *contextImpl) Redirect(code int, url string) error

将请求重定向到提供的 URL,并返回状态码。

func (*contextImpl) Error

func (c *contextImpl) Error(err error)

Error invokes the registered HTTP error handler.

注意

我们不应该在路由处理器函数和中间件中使用使用该方法,而是通过返回错误值,Slim 程序会调用我们定义的错误处理器函数来统一处理错误。

func (*contextImpl) Slim

func (c *contextImpl) Slim() *Slim

返回 Slim 实例