# 所有 Context 方法
这是`iris.Context`提供的方法的完整列表。
```
type Context interface {
// ResponseWriter 会按预期返回与http.ResponseWriter兼容的响应编写器。
ResponseWriter() ResponseWriter
// ResetResponseWriter 应该更改或升级 Context 的 ResponseWriter。
ResetResponseWriter(ResponseWriter)
// Request 请求按预期返回原始的 *http.Request 。
Request() *http.Request
// ResetRequest 设置Context 的 Request,
// 这个对于保存一个标准的 *http.Request#WithContext() 创建的新请求到 Iris' Context 很有用。
// 当出于某种原因要进行完整填充覆盖 *http.Request 的时候,请使用 `ResetRequest` 。
// 注意: 当你只想更改一个字段时,可以使用 Request() 返回指向 Request 的指针,
// 所以这样的更改将会在没有完全覆盖的情况下生效。
// 使用方法: 使用本地 http 处理程序 ,该处理程序使用标准的 "context" 包
// 获取值而不是 Iris 的 Context#Values():
// r := ctx.Request()
// stdCtx := context.WithValue(r.Context(), key, val)
// ctx.ResetRequest(r.WithContext(stdCtx)) 。
ResetRequest(r *http.Request)
// SetCurrentRouteName 在内部设置路由名称,
// 为了让开发人员调用 `GetCurrentRoute()` 方法的时候,
// 能够找到正确的当前 “只读” 路由。
// 它将由路由器初始化, 如果你手动修改名称
// 实际上什么都不会发生,除非你通过 `GetCurrentRoute()`
// 方法获得其他路由。
// 相反的,在当前上下文中执行不同的路径
// 你应该使用 `Exec` 方法
// 或者通过 `SetHandlers/AddHandler` 方法改变处理程序。
SetCurrentRouteName(currentRouteName string)
// GetCurrentRoute 返回正在被注册到当前请求路径的 "只读" 路由。
GetCurrentRoute() RouteReadOnly
// 调用 SetHandlers(handlers)
// 并执行第一个处理程序,
// 处理程序不应为空。
//
// 它由路由器使用, 开发人员可以使用它
// 立即替换并执行处理程序。
Do(Handlers)
// AddHandler 以添加处理程序到
// 服务时间内的当前请求中,
// 这些处理程序不会持久化到路由器。
//
// 路由器正在调用此函数以添加路由的处理程序。
// 如果 AddHandler 被调用, 则将插入处理程序
// 至已定义路由的处理程序的末尾。
//
AddHandler(...Handler)
// SetHandlers 用新的替换所有处理程序。
SetHandlers(Handlers)
// Handlers 继续跟踪当前处理程序。
Handlers() Handlers
// HandlerIndex 设置当前上下文的处理程序链
// 的当前索引。
// 如果传递了 -1,则返回
// 当前处理程序索引,而不更改当前索引。
//
// 同时查看 Handlers(), Next() 和 StopExecution() 。
HandlerIndex(n int) (currentIndex int)
// Proceed 是一种用于检查 一个特定的处理程序
// 是否被执行并且调用 `ctx.Next` 方法的替代方法。
// 这是有用的仅仅在当你在另一个处理程序
// 内运行一个处理程序.
// 它只是检查前索引和后索引。
//
// 一个用例是当你要在控制器的 `BeginRequest`
// 里面执行一个调用 `ctx.Next`的中间件。
// 控制器将整个流程 (BeginRequest, method handler, EndRequest)
// 当作一个处理程序, 所以如果 `ctx.Next` 在 `BeginRequest` 里面调用。
// 将不会影响到 method handler
//
// 尽管 `BeginRequest` 不应该用于调用其他处理程序,
// `BeginRequest` 已经被引入以便能够去设置
// 通用数据到所有处理程序,在它们被执行前。
// 控制器能想通常那样从 MVC 的应用的路由中接受中间件。
//
// 这样说,让我们来看一个 `ctx.Proceed` 的示例:
//
// var authMiddleware = basicauth.New(basicauth.Config{
// Users: map[string]string{
// "admin": "password",
// },
// })
//
// func (c *UsersController) BeginRequest(ctx iris.Context) {
// if !ctx.Proceed(authMiddleware) {
// ctx.StopExecution()
// }
// }
// Get() 将在和 `BeginRequest` 相同的处理程序中执行,
// 内部控制器检查 `ctx.StopExecution`。
// 那么 如果 BeginRequest 调用 `StopExecution`,则它不会被触发。
// func(c *UsersController) Get() []models.User {
// return c.Service.GetAll()
//}
// 如果中间件在失败时使用`ctx.StopExecution()` ,则替代方法是 `!ctx.IsStopped()`。
Proceed(Handler) bool
// HandlerName 返回当前处理程序的名称,这有助于调试。
HandlerName() string
// HandlerFileLine 返回当前处理程序的源文件和行信息。
// 主要在调试时有用。
HandlerFileLine() (file string, line int)
// RouteName 返回处理程序运行时的路由名称。
// 注意: 它将在未找到的处理程序上返回空值。
RouteName() string
// Next 调用处理程序链中的所有下一个处理程序,
// 应该在中间件内部使用。
//
// 注意: 自定义上下文应覆盖此方法,以便能够传递其自己的context.Context实现。
Next()
// NextOr 检查链是否具有下一个处理程序,如果有,则执行它
// 否则会根据给定的处理程序设置分配给此Context的新链
// 并执行其第一个处理程序。
//
// 如果存在并执行下一个处理程序,则返回true,否则返回false。
//
// 注意,如果找不到下一个处理程序,并且缺少处理程序,则
// 它将状态未找到(404)发送到客户端,并停止执行。
NextOr(handlers ...Handler) bool
// NextOrNotFound 检查链是否具有下一个处理程序,如果有,则执行它
// 否则它将状态未找到(404)发送给客户端并停止执行。
//
// 如果存在并执行下一个处理程序,则返回true,否则返回false。
NextOrNotFound() bool
// NextHandler 返回 (不执行) 理程序链中的下一个处理程序。
//
// 使用 .Skip() 跳过此处理程,如果需要执行此返回处理程序的下一个。
NextHandler() Handler
// Skip 跳过/忽略处理程序链中的下一个处理程序,
// 应该在中间件内部使用。
Skip()
// StopExecution如果被调用,则以下 .Next 调用将被忽略,
// 因此,不会触发链中的下一个处理程序。
StopExecution()
// IsStopped 检查并返回 true ,如果Context的当前位置为255。
// 表示调用了StopExecution()。
IsStopped() bool
// OnConnectionClose 注册将被触发的 "cb" 函数 (在其自身的 goroutine 中, 不需要 end-dev 注册的 goroutine )
// 当基础连接消失时。
//
// 此机制可用于取消服务器上的长时间操作
// 如果客户端在响应准备就绪之前已断开连接。
//
// 它取决于 `http#CloseNotify`。
// CloseNotify 可能会一直等待通知,直到 Request.Body 被
// 完整阅读。
//
// 在主处理程序返回后,无法保证
// 通道接收值。
//
// 最后,它报告协议是否支持管道 (HTTP/1.1禁用管道将不被支持)。
// "cb" 将不会触发 ,如果输出值是 false,
//
// 注意, 只能注册一个回调, 对于整个请求处理程序链/每个路由。
//
//查找` `ResponseWriter#CloseNotifier` 了解更多。
OnConnectionClose(fnGoroutine func()) bool
// OnClose 使用 `Context#OnConnectionClose`将回调函数 "cb" 注册到下划线连接关闭事件
// ,并在请求处理程序的末尾使用`ResponseWriter#SetBeforeFlush`。
// 注意, 只能注册一个回调, 对于整个请求处理程序链/每个路由。
//
// 有关更多信息,请参见 `Context#OnConnectionClose` 和 `ResponseWriter#SetBeforeFlush` 。
OnClose(cb func())
// +------------------------------------------------------------+
// | 在处理程序之间,当前 "用户/请求" 储存 |
// | 和分享信息 - Values(). |
// | 保存和获取命名路径参数 - Params() |
// +------------------------------------------------------------+
// Params 返回当前URL的命名参数键值存储。
// 命名路径参数将保存在此处。
// 此存储,作为整个上下文,是每个请求的生命周期。
Params() *RequestParams
// Values 返回当前 "user" 存储。
// 命名路径参数和任何可选数据将被保存在这里。
// 此存储,作为整个上下文,是每个请求的生命周期。
//
// 你可以使用此函数设置和获取本地值
// 可用于在处理程序和中间件之间共享信息
Values() *memstore.Store
// +------------------------------------------------------------+
// | 路径, Host, 子域, IP, Headers,本地化等... |
// +------------------------------------------------------------+
// Method 返回 request.Method,(客户端的http方法) 到服务器。
Method() string
// Path 返回完整的请求路径,
// 如果 EnablePathEscape 配置字段为true,则转义。
Path() string
// RequestPath 返回基于 '转义' 的完整的请求路径。
RequestPath(escape bool) string
// Host 返回当前网址的主机部分。
Host() string
// Subdomain返回此请求的子域(如果有)。
// 请注意,这是一种快速方法,无法涵盖所有情况。
Subdomain() (subdomain string)
// IsWWW 返回 true ,如果当前子域(如果有)是 www。
IsWWW() bool
// FullRqeuestURI 返回完整的URI,
// 包括方案,主机和相对的请求路径/资源。
FullRequestURI() string
// RemoteAddr 尝试解析并返回真实客户端的请求IP。
//
// 基于可以从 Configuration.RemoteAddrHeaders 修改的允许的标头名称。
//
// 如果基于这些标头的解析失败,则它将返回请求的 `RemoteAddr` 字段,
// 那些由服务器在HTTP处理程序之前填充的。
//
// 通过查看 `Configuration.RemoteAddrHeaders`,
// `Configuration.WithRemoteAddrHeader(...)`,
// `Configuration.WithoutRemoteAddrHeader(...)` 了解更多。
RemoteAddr() string
// GetHeader根据名称返回请求标头的值。
GetHeader(name string) string
// IsAjax 返回 true ,如果请求是一个 'ajax 请求'( XMLHttpRequest)。
//
// 没有100%的方式知道通过Ajax发出请求。
// 永远不要信任来自客户端的数据, 它们可以轻易的通过欺骗的手段被发送到服务器。
//
// /注意 , "X-Requested-With" 头可以被任何客户端修改(因为 "X-"前缀),
// 因此,不要依赖 IsAjax 处理真正的严重问题。
// 尝试找到另一种检测类型(即内容类型)的方法,
// 有许多博客描述了这些问题并提供了不同的解决方案,
//它始终取决于你正在构建的应用程序,
//这就是为什么 `IsAjax` 对于常规用途足够简单的原因。
//
//有关更多信息,请访问:https://developer.mozilla.org/en-US/docs/AJAX
// 和 https://xhr.spec.whatwg.org/ 。
IsAjax() bool
// IsMobile 检查客户端是否正在使用移动设备(电话或平板电脑)与此服务器进行通信。
// 如果返回值为true,则表示使用移动设备的http客户端
// 与服务器通信,否则为false。
//
// 请注意,这会检查 "User-Agent" 请求头。
IsMobile() bool
// GetReferrer 按照指定的方式从 "Referer" 头中提取并返回信息
// 在 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy 中
// o或通过URL查询参数 "referer"。
GetReferrer() Referrer
// GetLocale返回由i18n中间件找到的当前请求的 `Locale`。
// 同 `Tr` 一样。
GetLocale() Locale
// Tr根据带有可选参数的格式返回一个i18n本地化消息。
// 同 `GetLocale` 一样。
// 示例: https://github.com/kataras/iris/tree/master/_examples/i18n
Tr(format string, args ...interface{}) string
// +------------------------------------------------------------+
// | Headers 辅助方法 |
// +------------------------------------------------------------+
// Header 将头添加到响应编写器
Header(name string, value string)
// ContentType 将响应编写者头的键名 "Content-Type" 设置为 'cType' 的值。
ContentType(cType string)
// GetContentType 返回响应编写者 "Content-Type" 头的值
// 它可以用 'ContentType' 提前设置。
GetContentType() string
// GetContentType 返回请求的 "Content-Type" 头的值
GetContentTypeRequested() string
// GetContentLength 返回 请求 "Content-Length" 头的值。
// 返回 0 ,如果它的值是一个不能被找到或者不是有效数据的时候。
GetContentLength() int64
// StatusCode 设置响应的状态码头
// 同 .`GetStatusCode` 一样。
StatusCode(statusCode int)
// GetStatusCode 返回当前响应的状态码
// 同 `StatusCode` 一样。
GetStatusCode() int
// AbsoluteURI 解析“ s”并返回其绝对URI形式。
AbsoluteURI(s string) string
// Redirect 发送一个重定向响应发送到客户端
// 指向特定的网址或相对路径。
// 接受2个参数字符串和一个可选的int
// 第一个参数是要重定向的网址
// 第二个参数是应该发送的http状态,
// 默认值为302(StatusFound),
// 你可以将其设置为301(永久重定向)
// 或303(StatusSeeOther)(如果采用POST方法),
// 或StatusTemporaryRedirect(307)(如果需要的话)。
Redirect(urlToRedirect string, statusHeader ...int)
// +------------------------------------------------------------+
// | 各种请求和发布数据 |
// +------------------------------------------------------------+
// URLParam 如果url参数存在,则URLParam返回true,否则返回false。
URLParamExists(name string) bool
// URLParamDefault 从请求中返回get参数,
// 如果未找到,则返回 “ def”。
URLParamDefault(name string, def string) string
// URLParam 从请求中返回get参数(如果有)。
URLParam(name string) string
// URLParamTrim 返回url查询参数,并从请求中删除结尾的空格。
URLParamTrim(name string) string
// URLParamEscape 从请求中返回转义的url查询参数
URLParamEscape(name string) string
// URLParamInt 以请求中的int值形式返回url查询参数,
// 如果解析失败,则返-1和一个错误。
URLParamInt(name string) (int, error)
// URLParamIntDefault 将url查询参数作为请求中的int值返回,
// 如果未找到或解析失败,则返回 "def" 。
URLParamIntDefault(name string, def int) int
// URLParamInt32Default将url查询参数作为来自请求的int32值返回,
// 如果未找到或解析失败,则返回 "def" 。
URLParamInt32Default(name string, def int32) int32
// URLParamInt64 将url查询参数作为来自请求的int64值返回,
// 如果解析失败,则返-1和一个错误。
URLParamInt64(name string) (int64, error)
// URLParamInt64Default 从请求中返回url查询参数作为int64值,
// 如果未找到或解析失败,则返回 "def" 。
URLParamInt64Default(name string, def int64) int64
// URLParamFloat64 从请求中返回url查询参数作为float64值,
// 如果解析失败,则返-1和一个错误。
URLParamFloat64(name string) (float64, error)
// URLParamFloat64Default 从请求中返回url查询参数作为float64值,
// 如果未找到或解析失败,则返回 "def" 。
URLParamFloat64Default(name string, def float64) float64
// URLParamBool 以请求中的布尔值返回url查询参数,
// 如果解析失败,则返一个错误。
URLParamBool(name string) (bool, error)
// URLParams 返回一个GET查询参数的映射,如果有多个,则以逗号分隔
// 如果找不到任何内容,则返回一个空映射。
URLParams() map[string]string
// FormValueDefault 通过名称返回单个被解析的值,
// 包括 URL 字段的查询参数和 POST 或 PUT 表单数据。
//
// 就返回默的 "def"值,如果没有找到值
FormValueDefault(name string, def string) string
// FormValue 通过名称返回单个被解析的值,
// 包括 URL 字段的查询参数和 POST 或 PUT 表单数据。
FormValue(name string) string
// FormValues 通过名称返回被解析的值,包括 URL 字段的查询参数和 POST 或 PUT 表单数据。
//
// 默认表单的内存最大大小为32MB, 可以通过传递 `iris.WithPostMaxMemory`
// 配置到 `app.Run` 的第二个参数去修改默认值。
//
// 注意:必须检查 nil 。
FormValues() map[string][]string
// PostValueDefault 通过名称返回被解析的值,包括 URL 字段的查询参数和 POST 或 PUT 表单数据。
//
// 如果未找到,则返回 "def"。
PostValueDefault(name string, def string) string
// PostValue 通过名称返回被解析的值,包括 URL 字段的查询参数和 POST 或 PUT 表单数据。
PostValue(name string) string
// PostValueTrim 通过名称返回被解析的值,包括 URL 字段的查询参数和 POST 或 PUT 表单数据 ,而且是不带空格。
PostValueTrim(name string) string
// PostValueInt 通过名称来返回解析自 POST, PATCH,
// 或者 PUT 主体参数的 int 数据。
//
// 如果未找到,则返回-1和非 nil 错误。
PostValueInt(name string) (int, error)
// PostValueIntDefault 通过名称来返回解析自 POST, PATCH,
// 或者 PUT 主体参数的 int 数据。
//
// 如果未找到,则返回 "def" 。
PostValueIntDefault(name string, def int) int
// PostValueInt64 通过名称来返回解析自 POST, PATCH,
// 或者 PUT 主体参数的 int64 (原文是:float64) 数据。
//
// 如果未找到,则返回 -1 和非 nil 错误。
PostValueInt64(name string) (int64, error)
// PostValueInt64Default 通过名称来返回解析自 POST, PATCH,
// 或者 PUT 主体参数的 int64 数据。
//
// 如果未找到,则返回 "def" 。
PostValueInt64Default(name string, def int64) int64
//PostValueFloat64 (原文是: PostValueInt64Default) 通过名称来返回解析自 POST, PATCH,
// 或者 PUT 主体参数的 float64 数据。
//
// 如果未找到,则返回 -1 和非 nil 错误。
PostValueFloat64(name string) (float64, error)
// PostValueFloat64Default (原文是: PostValueInt64Default) 通过名称来返回解析自 POST, PATCH,
// 或者 PUT 主体参数的 float64 数据。
//
// 如果未找到,则返回 "def" 。
PostValueFloat64Default(name string, def float64) float64
// PostValueBool (原文是: PostValueInt64Default) 通过名称来返回解析自 POST, PATCH,
// 或者 PUT 主体参数的 bool 数据。
//
// 如果没有找到值,或者找到的值为 false, 则会返回 false , 否则就会返回 true。
PostValueBool(name string) (bool, error)
// PostValues 通过名称来返回所有解析自 POST, PATCH,
// 或者 PUT 主体参数的 struct 数据。
//
// 默认表单的内存最大大小为32MB, 可以通过传递 `iris.WithPostMaxMemory`
// 配置到 `app.Run` 的第二个参数去修改默认值。
PostValues(name string) []string
// FormFile 返回从客户端收到的第一个上载文件。
//
// 默认表单的内存最大大小为32MB, 可以通过传递 `iris.WithPostMaxMemory`
// 配置到 `app.Run` 的第二个参数去修改默认值。
//
// 示例: https://github.com/kataras/iris/tree/master/_examples/http_request/upload-file
FormFile(key string) (multipart.File, *multipart.FileHeader, error)
// UploadFormFiles 从客户端将所有收到的文件上传到系统物理位置 "destDirectory"。
//
// 第二个可选参数 "before" 使调用者有机会在保存到磁盘之前修改
// `*miltipart.FileHeader` ,它可以根据当前请求用于更改文件名,
// 所有 FileHeader的选项都可以被改变。如果在将文件保存到磁盘之前不需要使用此功能,
// 则可以忽略它。
//
// 请注意,它不会检查请求主体是否流式传输
//
// 如果服务器未收到文件,如果是由于操作系统的权限或`net/http.ErrMissingFile`
// 而无法创建至少一个新文件,则返回复制的长度为 int64,
// 并返回一个不为零的错误。
//
// 如果要接收和接受文件并手动进行管理,
// 则可以改用`Context.FormFile`并创建适合你需要的复制功能,
// 以下内容仅用于一般情况。
//
// 默认表单的内存最大大小为32MB, 可以通过传递 `iris.WithPostMaxMemory`
// 配置到 `app.Run` 的第二个参数去修改默认值。
//
// 查看 `FormFile`,一个更容易用来接受文件的函数。
//
//
// 示例: https://github.com/kataras/iris/tree/master/_examples/http_request/upload-files
UploadFormFiles(destDirectory string, before ...func(Context, *multipart.FileHeader)) (n int64, err error)
// +------------------------------------------------------------+
// | 自定以 HTTP 错误 |
// +------------------------------------------------------------+
// NotFound 使用特定的自定义错误处理程序,向客户端发出错误 404。
// 注意, 如果你不想下一个处理程序被执行,你需要调用 ctx.StopExecution(),
// 下一个处理程序在 iris 上正在被执行,因为你可以弹出这个
// 错误代码, 并且可以把它修改为更特别的一个错误。 例如:
// users := app.Party("/users")
// users.Done(func(ctx context.Context){ if ctx.StatusCode() == 400 { /* 为 /users 路由自定义错误代码 */ }})
NotFound()
// +------------------------------------------------------------+
// | 正文阅读器 |
// +------------------------------------------------------------+
// SetMaxRequestBodySize 设置对请求正文大小的限制,它
应在从客户端读取请求正文之前被调用。
SetMaxRequestBodySize(limitOverBytes int64)
// GetBody 读取并返回这个请求的正文。
// http 请求读取器的默认行为是使用数据读取
但是,你可以通过传递 "WithoutBodyConsumptionOnUnmarshal" iris的选项来更改该行为。
//
//但是, 你可以在任何地方使用 `ctx.Request().Body` 去替代它。
GetBody() ([]byte, error)
// UnmarshalBody 读取这个请求的正文,并且绑定它到一个值或者一个任意类型的指针。
// 使用示例: context.ReadJSON, context.ReadXML.
//
// 示例: https://github.com/kataras/iris/blob/master/_examples/http_request/read-custom-via-unmarshaler/main.go
//
// UnmarshalBody 不检查 gzipped 有关的数据。
// 不要依赖传入服务器的压缩数据。主要原因是: https://en.wikipedia.org/wiki/Zip_bomb
// 但是你仍然可以手动自由的去访问 `ctx.Request().Body io.Reader`。
UnmarshalBody(outPtr interface{}, unmarshaler Unmarshaler) error
// ReadJSON 从请求的正文中读取 JSON ,并且绑定它到一个值或者一个任意类型的指针。
//
// 示例: https://github.com/kataras/iris/blob/master/_examples/http_request/read-json/main.go
ReadJSON(jsonObjectPtr interface{}) error
// ReadXML 从请求的正文中读取 XML,并且绑定它到一个 xml-valid 类型值的指针。
//
// 示例: https://github.com/kataras/iris/blob/master/_examples/http_request/read-xml/main.go
ReadXML(xmlObjectPtr interface{}) error
// ReadYAML 从请求的正文中读取 YAML ,并且绑定它到 "outPtr" 值。
//
// 示例: https://github.com/kataras/iris/blob/master/_examples/http_request/read-yaml/main.go
ReadYAML(outPtr interface{}) error
// ReadForm 绑定表单数据到 formObject 对象,
// 它支持所有类型种类,包括自定义结构体。
// 如果请求数据是空的,它不会返回任何东西。
// 结构体的字段标签是 "form"。
//
// 示例代码: https://github.com/kataras/iris/blob/master/_examples/http_request/read-form/main.go
ReadForm(formObject interface{}) error
// ReadQuery 绑定 url 请求字符串到 "指针", 结构体的字段标签是 "url"。
//
// 示例代码: https://github.com/kataras/iris/blob/master/_examples/http_request/read-query/main.go
ReadQuery(ptr interface{}) error
// +------------------------------------------------------------+
// | 正文(原始)写入器 |
// +------------------------------------------------------------+
// Write 将数据作为 HTTP 回复的一部分写入连接。
//
// 如果 WriteHeader 还没有被调用, Write 调用
// WriteHeader(http.StatusOK) 在写入内容之前, 如果 Header
// 没有包含一个 Content-Type 行, Write 添加一个 Content-Type
// 去设置将初始 512 字节的写入数据传递到检测内容类型的结果。
//
// 根据 HTTP 协议版本和客户端,调用
// Write或 WriteHeader 可能会阻止将来在
// Request.Body。对于 HTTP/1.x 请求,处理程序应读取任何
// 编写响应之前所需的请求正文数据。一旦
// 标头已刷新(由于显式 Flusher.Flush 或写入足够的数据以触发刷新),请求正文
// 可能不可用。对于 HTTP/2 请求,Go HTTP 服务器允许
// 处理程序以继续读取请求正文,同时
// 编写响应。但是,此类行为可能不受支持
// 由所有 HTTP/2 客户端。处理程序应在写入之前读取
// 可以最大化兼容性。
Write(body []byte) (int, error)
// Writef 根据格式说明符格式化并写入响应。
//
// /返回写入的字节数以及遇到的任何写入错误
Writef(format string, args ...interface{}) (int, error)
// WriteString 将简单的字符串写入响应。
//
// 返回写入的字节数以及遇到的任何写入错误。
WriteString(body string) (int, error)
// SetLastModified 根据 "modtime" 输入设置 "Last-Modified"。
// 如果 "modtime" 为零,则不执行任何操作。
//
// 它主要在内部位于核心/路由器和上下文包中。
//
// 注意,使用的是 modtime.UTC() 而不是 modtime,因此
// 你无需了解内部原理就可以使用它们。
SetLastModified(modtime time.Time)
// CheckIfModifiedSince 检查响应是否已经被更新,自从 "modtime" 以来。
// 请注意,它与服务器端缓存无关。
// 它通过检查 "If-Modified-Since" 请求头是否被客户端发送,
// 或者以前的请求头(例如,使用 WriteWithExpiration 或者 HandleDir 或者 Favicon 等等。)仍然有效,并且这些请求头都是在 "modtime" 之前,来做这些检查。
//
// 对 !modtime && err == nil 做一个检查是有必要的,以用来确定
// 它之前没有更新过, 因为它可能返回 false,但有时候我们甚至没有机
// 会检查客户端(请求)标头由于一些错误,
// 就像 HTTP 方法不是 "GET" 或者 "HEAD" 或者 "modtime" 是 0,或者
// 从错误的头中解析时间的时候一样。
//
// 它主要在内部使用,例如: `context#WriteWithExpiration`。 `ErrPreconditionFailed` 也是一样。
//
// 注意,使用的是 modtime.UTC() 而不是 modtime,因此
// 你无需了解内部原理就可以使用它们。
CheckIfModifiedSince(modtime time.Time) (bool, error)
// WriteNotModified 发送一个 304 "Not Modified" 状态码到客户端,
// 它用来确认在响应发送前,内容类型,内容长度等请求头
// 和 任意的 "ETag" 都已经被移除。
//
// 它主要用于核心 core/router/fs.go 和上下文方法中。
WriteNotModified()
// WriteWithExpiration 像 `Write` 一样工作, 但是它会一直检查一个资源是否被更新,
// 基于 "modtime" 输入参数,
// 否则会发送一个 304 状态码来让客户端侧显示缓存内容
WriteWithExpiration(body []byte, modtime time.Time) (int, error)
// StreamWriter 注册给定的流编写器以填充响应正文。
//
// 访问写入器禁止的上下文和/或其成员。
//
// 此函数可用于以下情况:
//
// * 如果响应正文太大 (大于 iris.LimitRequestBodySize(如果设置了)).
// * 如果响应正文从缓慢的外部源流式传输。
// * 如果响应正文必须以块数流式传输到客户端。
// (aka `服务器推送`).
//
// 接收一个当响应写入器应该停止写入的时候,会接收它并返回 false 的函数,
// 否者会返回 true 以用来继续写入内容。
StreamWriter(writer func(w io.Writer) bool)
// +------------------------------------------------------------+
// | 正文压缩写入器 |
// +------------------------------------------------------------+
// ClientSupportsGzip 返回 true ,如果客户端支持 gzip 压缩、
ClientSupportsGzip() bool
// WriteGzip 接收字节,字节被使用 gzip 格式压缩,并且被发送到客户端的。
// 返回写入的字节数和一个错误 (如果客户端不支持 gzip 压缩)
// 你可以毫无问题的多次在同一处理程序中重复使用此函数
// 写更多的数据。
WriteGzip(b []byte) (int, error)
// TryWriteGzip 接收字节,字节被使用 gzip 格式压缩,并且被发送到客户端的。
// 如果客户端不支持 gzip 压缩 ,这些内容会以未压缩形式发送。
TryWriteGzip(b []byte) (int, error)
// GzipResponseWriter 当它的 .Write 调用它将数据压缩到 gzip 并将其写入客户端的时候,
//将当前响应编写器转换为响应编写器
。
//
// 也可以使用它的 .Disable 和 .ResetBody 去禁用以回滚到常用的响应写入器。
GzipResponseWriter() *GzipResponseWriter
// Gzip 启用或者禁用 (如果之前已经启用) gzip 响应写入器,如果客户端支持
// gzip 压缩,所以接下来响应数据将会被压缩承 gzip 数据发送到客户端。
Gzip(enable bool)
// +------------------------------------------------------------+
// | 丰富的正文内容编写器/呈现器 |
// +------------------------------------------------------------+
// ViewLayout 设置 "layout" 选项,当 .View
// 被调用之后,在相同通的请求中会非常有用,
// 当需要基于处理程序链中的上一个处理程序,设置或者改变一个 layout时。
//
// 注意, 'layoutTmplFile' 变量可以被设置到 iris.NoLayout 或者 view.NoLayout
// 去禁用 layout, 在一些特殊的视图渲染操作中。
// 他禁用引擎配置的layout 属性。
//
// .ViewData 和 .View 看起来是一样的。
//
// 示例: https://github.com/kataras/iris/tree/master/_examples/view/context-view-data/
ViewLayout(layoutTmplFile string)
// ViewData 在同一个请求中,当 .View
// 被调用之后,保存一个或多个键值对,以便被传递。
// 当需要基于处理程序链中的上一个处理程序,设置或者改变一个模板数据时非常有用。
//
// 如果 .View' 的 "绑定" 参数不是 nil 并且它不是一个映射类型
// 那么这些数据都会被忽略,绑定具有优先级, 因此主路由的处理程序仍然可以运行。
// 如果绑定是一个映射或者 context.Map 那么这些数据都会被添加到视图数据中
// 并被传递给模版。
//
// 调用 .View 之后, 这些数据没有被摧毁,为了能够重复利用(重复,在完全相同求情中),
// 要清除这些视图数据,开发这可以调用:
// ctx.Set(ctx.Application().ConfigurationReadOnly().GetViewDataContextKey(), nil)
//
// 如果 'key' 是空的,那么这个值可以被添加到它的(结构体或者映射)中 并且开发这不能添加其他值。
//
// .ViewLayout 和 .View 看起来是一样的。
//
// 示例: https://github.com/kataras/iris/tree/master/_examples/view/context-view-data/
ViewData(key string, value interface{})
// GetViewData 返回被 `context#ViewData`注册的值。
// 返回值是一个`map[string]interface{}`,这意味着,如果
// 一个自定义结构体被注册到 ViewData 那么这个函数
// 将会尝试将它解析到映射中, 如果失败那么返回值将会是一个 nil。
// 如果不同类型的值或者没有数据通过 `ViewData` 被注册,
// 那么对 nil 的检查一直是一个好的实践。
//
// 同理对于 `viewData := ctx.Values().Get("iris.viewData")` 或者
// `viewData := ctx.Values().Get(ctx.Application().ConfigurationReadOnly().GetViewDataContextKey())`.
GetViewData() map[string]interface{}
// 视图基于注册的视图引擎渲染一个模版。
//第一个参数接受一个相对于视图引擎的目录和扩展的文件名,
// 即: 如果目录是 "./templates" 的同时想要渲染 "./templates/users/index.html"
// 那么你使用 "users/index.html" 作为文件名参数。
//
// 第二个可选参数可以接收单个 "视图模型",
// 它被绑定到视图模版上。如果它不是nil,
// 否则它将会在相同的请求中检查下一个被 `ViewData` 保存的视图数据
// 甚至被下一个处理程序(中间件)保存的视图数据 。
//
// .ViewData` 和 .ViewLayout 看起来是一样的。
//
// 示例: https://github.com/kataras/iris/tree/master/_examples/view
View(filename string, optionalViewModel ...interface{}) error
// Binary 将原始字节作为二进制数据写入。
Binary(data []byte) (int, error)
// Text 将字符串写成纯文本。
Text(format string, args ...interface{}) (int, error)
// HTML 将字符串写成 text/html。
HTML(format string, args ...interface{}) (int, error)
// JSON 整顿(原文:marshals)给定的接口对象并编写JSON响应。
JSON(v interface{}, options ...JSON) (int, error)
// JSONP 整顿(原文:marshals)给定的接口对象并编写 JSONP(原文:JSON) 响应。
JSONP(v interface{}, options ...JSONP) (int, error)
// XML整顿(原文:marshals)给定的接口对象并编写 XML 响应。
// 将映射渲染为 XML ,查看 `XMLMap` 包级函数。
XML(v interface{}, options ...XML) (int, error)
// Problem 编写一个 JSON 或 XML 问题响应。
// 问题字段并不是一直以相同的顺序呈现。
//
// 行为完全像 `Context.JSON`
// 但是,默认的 ProblemOptions.JSON 缩进是 " " 而且是一个
// 内容是 "application/problem+json" 类型的响应。
//
// 使用 options.RenderXML 和 XML 字段去改变这些行为并且
// 发送一个内容是 "application/problem+xml" 类型的响应。
//
// 阅读更多关于: https://github.com/kataras/iris/wiki/Routing-error-handlers 的内容。
Problem(v interface{}, opts ...ProblemOptions) (int, error)
// Markdown 解析 markdown 为 html ,并将其结果呈现给客户端。
Markdown(markdownB []byte, options ...Markdown) (int, error)
// YAML 使用 yaml 解析器解析 “v”,并将其结果呈现给客户端。
YAML(v interface{}) (int, error)
// +-----------------------------------------------------------------------+
// | 内容协议 |
// | https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation | |
// +-----------------------------------------------------------------------+
// Negotiation 创建一次并返回协议生成器,
// 为特定的 mime 类型构建服务端的可用内容
// 和字符集。
//
// `Negotiate`看起来也一样。
Negotiation() *NegotiationBuilder
// Negotiate 用于在同一个 URI 上为不同的资源形式提供服务。
//
// "v" 可以是一个单个 `N` 结构值。
// "v" 可以是任意完成了 `ContentSelector` 接口的值。
//"v" 可以是任意完成了 `ContentNegotiator` 接口的值。
// "v" 可以是任意 (JSON, JSONP, XML, YAML)结构的值或者,
// (TEXT, HTML)字符串 或者 []byte(Markdown, Binary) 或者 任何匹配的mime类型的 []byte。
//
// 如果 "v" 是 nil, 将会使用 `Context.Negotitation()` 构建器的
// 内容去替代它, 否则 "v" 会覆盖构建器的内容
// (服务器的 mime 类型一直受到它所注册和支持的 mime 列表的检索。)
//
// 通过 `Negotiation().JSON().XML().HTML()...`设置mime类型优先级。
// 通过 `Negotiation().Charset(...)` 设置字符集优先级。
// 通过 `Negotiation().Encoding(...)` 设置编码算法优先级。
// 通过
// `Negotiation().Accept./Override()/.XML().JSON().Charset(...).Encoding(...)... 修改接受的内容。
//
// 当没有匹配的 mime 类型,它会返回 `ErrContentNotSupported`。
//
// 相关资源:
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Charset
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
//
// 支持以上没有特性的值。
//
// 有关更多信息,请访问: https://github.com/kataras/iris/wiki/Content-negotiation
Negotiate(v interface{}) (int, error)
// +------------------------------------------------------------+
// | 文件服务 |
// +------------------------------------------------------------+
// ServeContent 通过自动设置接收的三个参数
//来服务内容和头, 它是一个低级的函数,你可以使用 .ServeFile(string,bool)/SendFile(string,string) 来替代它
//
//
// 在这个函数调用之前,你可以使用 `context#ContentType`来定义自己的 "Content-Type"。
//
// 这个函数不支持恢复 (通过范围),
// 需要使用 ctx.SendFile 或者路由的 `HandleDir` 去替代它。
ServeContent(content io.ReadSeeker, filename string, modtime time.Time, gzipCompression bool) error
// ServeFile 发送一个文件 (用于发送一个文件,一个 zip 文件。例如:发送到客户端你应该使用`SendFile` 来替代)
// 接收两个参数
// filename/path (string)
// gzipCompression (bool)
//
// 在这个函数调用之前,你可以使用 `context#ContentType`来定义自己的 "Content-Type"。
//
// 这个函数不支持恢复 (通过范围),
// 需要使用 ctx.SendFile 或者路由的 `HandleDir` 去替代它。
//
// 当你想要服务动态文件到客户端的时候,请使用它。
ServeFile(filename string, gzipCompression bool) error
// SendFile 将文件发送到客户端进行强制下载
//
// 使用它来替代 ServeFile 用于在客户端 '强制下载' 大文件。
SendFile(filename string, destinationName string) error
// +------------------------------------------------------------+
// | Cookies |
// +------------------------------------------------------------+
// SetCookie 增加一个 cookie.
// "选项"不是必需的,它们可用于修改 "cookie" 。
//
// 例如: https://github.com/kataras/iris/tree/master/_examples/cookies/basic
SetCookie(cookie *http.Cookie, options ...CookieOption)
// SetCookieKV 增加一个 cookie,需要使用 name(字符串) 和 value(字符串)。
//
// 它的默认有效期是 2 小时并且它会被添加到根路径,
// 使用 `CookieExpires` 和 `CookiePath` 更新它们。
// 或者: ctx.SetCookie(&http.Cookie{...})
//
//如果你想要设置自定义路径:
// ctx.SetCookieKV(name, value, iris.CookiePath("/custom/path/cookie/will/be/stored"))
//
// 如果你想要它仅仅是当前请求路径可见:
// ctx.SetCookieKV(name, value, iris.CookieCleanPath/iris.CookiePath(""))
// More:
// iris.CookieExpires(time.Duration)
// iris.CookieHTTPOnly(false)
//
// 例如: https://github.com/kataras/iris/tree/master/_examples/cookies/basic
SetCookieKV(name, value string, options ...CookieOption)
// GetCookie 返回通过它的名称一个 cookie 的值。
// 如果没有找到值,将会返回一个空的字符串。
//
// 如果你想要比值更多的返回,使用:
// cookie, err := ctx.Request().Cookie("name")
//
// 例如: https://github.com/kataras/iris/tree/master/_examples/cookies/basic
GetCookie(name string, options ...CookieOption) string
// RemoveCookie 通过它的名称和路径 = "/",删除一个 cookie 。
// 小贴士: 改变当前 cookie 的路径通过: RemoveCookie("name", iris.CookieCleanPath)
//
// 例如: https://github.com/kataras/iris/tree/master/_examples/cookies/basic
RemoveCookie(name string, options ...CookieOption)
// VisitAllCookies 接受一个 visitor 函数,它在每次(请求的) cookie 的 name 和 value 上调用。
VisitAllCookies(visitor func(name string, value string))
// MaxAge 返回 "cache-control" 请求头的秒数值
// 作为 int64 类型,
// 如果头没有找到或者解析失败那么它将会返回 -1。
MaxAge() int64
// +------------------------------------------------------------+
// | 高级:响应记录器和事务 |
// +------------------------------------------------------------+
// Record 将 context 的基础和直接的 responseWriter 转化为一个 ResponseRecorder,
// 它可以被用于在任何时候去重置正文,重置头,以及获取正文,
// 获取和设置状态码和更多内容。
Record()
// Recorder 返回 context 的 ResponseRecorder。
// 如果当它开始记录但是有没有没有记录的时候返回新的 context 的 ResponseRecorder。
Recorder() *ResponseRecorder
// IsRecording 返回响应的记录器和一个 true 值,
// 当响应记录者正在记录状态码,正文,响应头等等内容时,
// 如果没有,也会返回 nil 和 false。
IsRecording() (*ResponseRecorder, bool)
// BeginTransaction 启动作用域的事务。
//
// 你可以搜索有关业务交易工作方式的第三方文章或书籍(非常简单,尤其是此处)。
//
// 请注意,这是唯一的,新的
//(*到目前为止,我从未在 Golang 中见过任何其他关于这个主题的例子或代码,就像大多数iris 功能一样)。
// 它并不涵盖所有路径,
// 例如数据库, 这应该由你用来建立数据库连接的库进行管理,,
// 此事务范围仅用于上下文的响应。
// Transactions 有自己的中间件生态系统,请看 iris.go:UseTransaction。
//
// 查看 https://github.com/kataras/iris/tree/master/_examples/ 以了解更多。
BeginTransaction(pipe func(t *Transaction))
// SkipTransactions 如果被调用,那么会跳过其余的事务
// 或者在第一个事务之前它们都已经被调用。
SkipTransactions()
// TransactionsSkipped 返回 true 如果事务被完全跳过或者取消。
TransactionsSkipped() bool
// Exec 基于上下文修改了一个方法和用户请求一样的路径调用 `context/Application#ServeCtx`,但它不是。(这句翻译的有带点蛋疼,原文:Exec calls the `context/Application#ServeCtx` based on this context but with a changed method and path like it was requested by the user, but it is not.)
//
//
// 离线意味着路由已注册到iris,并具有正常路由具有的所有功能
// 但它不能通过浏览,其他处理程序的上下文调用他,它的处理程序才会执行。
// 它可以验证路径、具有会话、路径参数等。
//
// 你可以通过 app.GetRoute("theRouteName") 找到这个路由。
// 你可以设置一个路由名称作为: myRoute := app.Get("/mypath", handler)("theRouteName")
// 它将会设置一个名称到这路由并且返回他的路由信息实例,以便进一步使用。
//
// 它不会更改全局状态,如果路由处于"脱机"状态,则它将保持脱机状态。
//
// app.None(...) 和 app.GetRoutes().Offline(route)/.Online(route, method)
//
// 例如: https://github.com/kataras/iris/tree/master/_examples/routing/route-state
//
// 用户可以通过简单使用获得响应, rec := ctx.Recorder(); rec.Body()/rec.StatusCode()/rec.Header().
//
// 保留上下文的值和会话,以便能够通过结果路由进行通信。
//
// 这是极端使用的情况,99% 的时间永远不会对你有用。
Exec(method, path string)
// RouteExists 报告是否存在特定路由
// 它将从上下文主机的当前子域(如果不是在根域内)进行搜索。
RouteExists(method, path string) bool
// Application 返回属于此上下文的 iris 应用实例。
// 值得注意的是,此函数返回一个接口
// 的应用程序,其中包含安全的方法
// 在服务时间执行。 为了开发人员的安全,
// 此处无法提供完整的应用字段和方法。
Application() Application
// String 返回此请求的字符串表示形式。
// 每个上下文都有一个唯一的字符串表示形式。
// 它可用于简单的调试方案,即将上下文打印为字符串。
//
// 它返回什么?一个数字,
// 它声明每个可执行应用程序的"String"总调用的长度,
// 然后是远程 IP(客户端),最后是 方法:url。
String() string
}
```