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{}
默认上下文结构体,实现了 Context 和 EditableContext 这两个接口。
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.Flusher、http.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 协议方案,值是 http 或 https。
func (*contextImpl) RealIP
func (c *contextImpl) RealIP() string
基于报头 X-Forwarded-For 和 X-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 实例