路由上下文概要

之前文档所使用的iris.Context源代码可以找到这里({$goPath}\github.com\kataras\iris\context\context.go)。使用IDE /编辑器auto-complete功能将对您有所帮助。我们这里对context里的方法进行剖析(了解)

  1. package context
  2. type Context interface {
  3. // BeginRequest 针对每一个请求都会执行
  4. // 它应该为新的请求准备(新的或从pool获得的)上下文的字段。
  5. // 要跟随iris的流程,开发人员应:
  6. // 1. 重置handler 为nil
  7. // 2. 重置 values 为空
  8. // 3. 重置会话为 nil
  9. // 4. 重置 response writer 到 http.ResponseWriter
  10. // 5. 重置 request 到 *http.Request
  11. // 任何其他可选步骤都取决于开发的应用程序类型。
  12. BeginRequest(http.ResponseWriter, *http.Request)
  13. // 在请求被响应以后 执行EndRequest,并且这个请求的上下文变为无效或者已经释放
  14. // 要跟随iris的流程,开发人员应:
  15. // 1.刷新响应编写器的结果
  16. // 2.刷新响应编写器的结果
  17. // 任何其他可选步骤都取决于开发的应用程序类型。
  18. EndRequest()
  19. //ResponseWriter按预期返回与http.ResponseWriter兼容的响应编写器。
  20. ResponseWriter() ResponseWriter
  21. // 改变或者升级ResponseWriter.
  22. ResetResponseWriter(ResponseWriter)
  23. // 按预期返回原始的* http.Request。
  24. Request() *http.Request
  25. // SetCurrentRouteName在内部设置路由的名称,
  26. //为了能够找到正确的当前“只读”路由时
  27. // end-developer调用`GetCurrentRoute()`函数。
  28. //如果您更改了该名称,它将由路由器初始化,他只会更改当名称
  29. // 通过`GetCurrentRoute()`您将会得到所更改的名称。
  30. //相反,要执行不同的路径
  31. //你应该使用`Exec`函数
  32. //或通过`SetHandlers 或者 AddHandler`函数更改处理程序。
  33. SetCurrentRouteName(currentRouteName string)
  34. // GetCurrentRoute返回当前注册的“只读”路由
  35. //正在注册此请求的路径。
  36. //r:=ctx.GetCurrentRoute()//获取当前路由
  37. //fmt.Println(r)//输出:GET /users/{id:int}/profile
  38. GetCurrentRoute() RouteReadOnly
  39. //调用 SetHandlers(handlers)
  40. // 并且执行该方法所设置的第一个handlers
  41. // handlers 不应该为空.
  42. // 这是路由器使用的 开发者应该使用exex(Handler)直接调用要执行的handler
  43. Do(Handlers)
  44. // AddHandler可以添加处理程序
  45. //到服务时间的当前请求,
  46. //这些处理程序没有持久化到路由器。
  47. //路由器正在调用此函数来添加路由的处理程序。
  48. //如果调用了AddHandler,则会插入处理程序
  49. //到已经定义的路由处理程序的末尾。
  50. //ctx.Handlers()[1](ctx)//调用当前添加的函数1为当前handler再handlers数组中的下标
  51. //再当前被添加的函数中使用ctx.HandlerIndex(2)定义该函数的位置
  52. AddHandler(...Handler)
  53. //SetHandlers用新的 handler取代所有处理程序。
  54. SetHandlers(Handlers)
  55. //返回当前所有的可调用的handler。
  56. Handlers() Handlers
  57. // 设置当前hander 在handeler数组中的下标位置返回-1代表ok
  58. // Look Handlers(), Next() and StopExecution() too.
  59. HandlerIndex(n int) (currentIndex int)
  60. // Proceed 是检查特定处理程序是否已被执行并在其中调用`ctx.Next`函数的另一种方法
  61. // 只有在内部运行处理程序时,这才有用
  62. // 另一个处理它只是在索引和after索引之前检查。
  63. // 一个使用实例就是去执行一个中间件
  64. // 在控制器的`BeginRequest`中调用其中的`ctx.Next`。
  65. // Controller查看整个流程(BeginRequest,方法处理程序,EndRequest) 作为一个处理程序,
  66. // 所以`ctx.Next`不会反映到方法处理程序中
  67. // 如果从`BeginRequest`调用。
  68. //
  69. // 虽然`BeginRequest`不应该用于调用其他处理程序,
  70. //引入了`BeginRequest`以便能够设置 执行前所有方法处理程序的公共数据。
  71. // 控制器可以正常接受来自MVC的应用程序路由器的中间件。
  72. // 让我们看一个`ctx.Proceed`的例子:
  73. // var authMiddleware = basicauth.New(basicauth.Config{
  74. // Users: map[string]string{
  75. // "admin": "password",
  76. // },
  77. // })
  78. // func (c *UsersController) BeginRequest(ctx iris.Context) {
  79. // if !ctx.Proceed(authMiddleware) {
  80. // ctx.StopExecution()
  81. // }
  82. // }
  83. //这个Get()将在与`BeginRequest`相同的处理程序中执行,
  84. //内部控制器检查`ctx.StopExecution`。
  85. //因此,如果BeginRequest调用了`StopExecution`,它将不会被触发。
  86. // func(c *UsersController) Get() []models.User {
  87. // return c.Service.GetAll()
  88. // }
  89. // 另一种方法是`!ctx.IsStopped()`如果中间件在失败时使用`ctx.StopExecution()`。
  90. Proceed(Handler) bool
  91. // HandlerName返回当前处理程序的名称,有助于调试。格式package.function
  92. HandlerName() string
  93. / Next从处理程序链中调用所有下一个处理程序,
  94. //它应该在中间件中使用
  95. //注意:自定义上下文应该重写此方法,以便能够传递自己的context.Context实现。
  96. Next()
  97. // NextOr检查链是否有下一个处理程序,如果是,则执行它
  98. //否则它根据给定的处理程序设置分配给此Context的新链
  99. //并执行其第一个处理程序。
  100. //如果存在并执行下一个处理程序,则返回true,否则返回false
  101. //请注意,如果找不到下一个处理程序,则缺少处理程序
  102. //它向客户端发送未找到状态(404)并停止执行。
  103. NextOr(handlers ...Handler) bool
  104. // NextOrNotFound检查链是否有下一个处理程序,如果是,则执行它
  105. //否则它会向客户端发送未找到状态(404)并停止执行。
  106. //如果存在并执行下一个处理程序,则返回true,否则返回false
  107. NextOrNotFound() bool
  108. // NextHandler从处理程序链返回(它不执行)下一个处理程序。
  109. //如果需要执行下一个返回处理程序,请使用.Skip()跳过此处理程序。
  110. NextHandler() Handler
  111. //跳过/忽略处理程序链中的下一个处理程序,
  112. //它应该在中间件中使用
  113. Skip()
  114. //终止当前程序但不是退出(等于设定一个终止标记)
  115. //如果调用StopExecution,则调用以下.Next调用被忽略,
  116. //因此链中的下一个处理程序不会被触发。
  117. StopExecution()
  118. // IsStopped检查并在Context的当前位置为255时返回true,
  119. //表示调用了StopExecution()
  120. IsStopped() bool
  121. // 请求参数介绍
  122. // Params返回当前url的命名参数键值存储。
  123. //这里保存了命名路径参数。
  124. //作为整个Context,此存储是按请求生存期。
  125. Params() *RequestParams
  126. /值返回当前的“用户”存储。
  127. //可以在此处保存命名路径参数和任何可选数据。
  128. //作为整个Context,此存储是按请求生存期。
  129. //您可以使用此函数来设置和获取本地值
  130. //可用于在处理程序和中间件之间共享信息。
  131. Values() *memstore.Store
  132. //翻译是i18n(本地化)中间件的功能,
  133. //它调用Get(“translate”)来返回翻译的值。
  134. //示例:https://github.com/kataras/iris/tree/master/_examples/miscellaneous/i18n
  135. Translate(format string, args ...interface{}) string
  136. // +------------------------------------------------------------+
  137. // |路径,主机,子域,IP,标头等... |
  138. // +------------------------------------------------------------+
  139. // 返回request.Method,客户端的http方法返回给服务器
  140. Method() string
  141. // Path返回完整的请求路径,/name 不包含host 和请求参数
  142. //如果EnablePathEscape配置字段为true,则进行转义。
  143. Path() string
  144. // RequestPath返回完整的请求路径
  145. //基于'escape'。
  146. RequestPath(escape bool) string
  147. // Host返回当前url的主机部分。如localhost
  148. Host() string
  149. // Subdomain返回此请求的子域(如果有)。
  150. //请注意,这是一种不能涵盖所有情况的快速方法。
  151. Subdomain() (subdomain string)
  152. //如果当前子域(如果有)是www,则IsWWW返回true。
  153. IsWWW() bool
  154. / RemoteAddr尝试解析并返回真实客户端的请求IP
  155. //基于可从Configuration.RemoteAddrHeaders修改的允许标头名称。
  156. //如果基于这些头的解析失败,那么它将返回Request的`RemoteAddr`字段
  157. //在HTTP处理程序之前由服务器填充。
  158. //查看 `Configuration.WithRemoteAddrHeader(...)`,
  159. // `Configuration.WithoutRemoteAddrHeader(...)` for more.
  160. RemoteAddr() string
  161. // GetHeader根据名称返回请求标头的值。
  162. GetHeader(name string) string
  163. //如果此请求是'ajax请求'(XMLHttpRequest),则IsAjax返回true
  164. //没有100%的方式知道请求是通过Ajax进行的。
  165. //您永远不应该信任来自客户端的数据,可以通过欺骗轻松克服这些数据。
  166. //注意“X-Requested-With”标题可以被任何客户端修改(因为“X-”),
  167. //所以不要依赖IsAjax来做真正严肃的事情,
  168. //尝试找到另一种检测类型的方法(即内容类型),
  169. //有很多博客描述这些问题并提供不同类型的解决方案,
  170. //它始终取决于您正在构建的应用程序,
  171. //这就是为什么这个'IsAjax``足够简单以便通用的原因。
  172. //阅读更多信息:
  173. IsAjax() bool
  174. // IsMobile会检查客户端是否正在使用移动设备(手机或平板电脑)与此服务器通信。
  175. //如果返回值为true,则表示http客户端使用移动设备
  176. //设备与服务器通信,否则为false。
  177. //请注意,这会检查“User-Agent”请求标头。
  178. IsMobile() bool
  179. // +------------------------------------------------------------+
  180. // |响应头助手 |
  181. // +------------------------------------------------------------+
  182. // 添加一个响应头
  183. Header(name string, value string)
  184. //设置响应头 "Content-Type" to the 'cType'.
  185. ContentType(cType string)
  186. // GetContentType返会响应头 “Content-Type”
  187. //可以使用'ContentType'设置之前。
  188. GetContentType() string
  189. // GetContentLength 返回请求头 "Content-Length". 的值
  190. //当改值没有找到或者不是一个数字 将会返回0
  191. GetContentLength() int64
  192. // StatusCode 设置响应的statu code 值
  193. StatusCode(statusCode int)
  194. //返回响应的当前状态代码。
  195. GetStatusCode() int
  196. //重定向向客户端发送重定向响应
  197. //到特定网址或相对路径。
  198. //接受2个参数字符串和一个可选的int
  199. //第一个参数是要重定向的URL
  200. //第二个参数是应该发送的http状态,
  201. //默认为302(StatusFound),
  202. //你可以将它设置为301(Permant重定向)
  203. //或303(StatusSeeOther)如果POST方法,
  204. //或StatusTemporaryRedirect(307),如果这是nessecery。
  205. Redirect(urlToRedirect string, statusHeader ...int)
  206. // +------------------------------------------------------------+
  207. // | 各种请求和Post数据 |
  208. // +------------------------------------------------------------+
  209. // URLParam 如果url参数存在,则返回true,否则返回false。
  210. URLParamExists(name string) bool
  211. // URLParamDefault返回请求中的get参数,
  212. //如果没有找到 则返回 设定的 "def".
  213. URLParamDefault(name string, def string) string
  214. //URLParam返回请求中的get参数(如果有)。
  215. URLParam(name string) string
  216. // 返回url查询参数,其中从请求中删除了尾随空格。
  217. URLParamTrim(name string) string
  218. // URLParamTrim 从请求中返回转义的url查询参数。URLParamEscape(名称字符串)字符串
  219. URLParamEscape(name string) string
  220. // URLParamInt将url查询参数作为来自请求的int值返回,
  221. //返回-1,如果解析失败则返回错误。
  222. URLParamInt(name string) (int, error)
  223. //将url查询参数作为来自请求的int值返回,
  224. //如果找不到或解析失败,则返回 设定的 "def".
  225. URLParamIntDefault(name string, def int) int
  226. // URLParamInt64 将url查询参数作为来自请求的int64值返回,
  227. //返回-1,如果解析失败则返回错误。
  228. URLParamInt64(name string) (int64, error)
  229. // URLParamInt64Default 将url查询参数作为来自请求的int64值返回,
  230. //如果找不到或解析失败,则返回 设定的 "def".
  231. URLParamInt64Default(name string, def int64) int64
  232. // URLParamFloat64 将url查询参数作为来自请求的float64值返回,
  233. //返回-1,如果解析失败则返回错误。
  234. URLParamFloat64(name string) (float64, error)
  235. // URLParamFloat64Default 将url查询参数作为来自请求的float64值返回,
  236. //如果找不到或解析失败,则返回 设定的 "def".
  237. URLParamFloat64Default(name string, def float64) float64
  238. // URLParamFloat64 将url查询参数作为来自请求的bool值返回,
  239. //返回-1,如果解析失败则返回错误。
  240. URLParamBool(name string) (bool, error)
  241. // URLParams返回由逗号分隔的GET查询参数的映射(如果有多个)
  242. //如果找不到任何内容,则返回空map。
  243. URLParams() map[string]string
  244. // FormValueDefault通过其"名称"返回单个解析的表单值,
  245. //包括URL字段的查询参数和POST或PUT表单数据。
  246. //如果没有找到返回设定的def
  247. FormValueDefault(name string, def string) string
  248. // FormValue通过其“名称”返回单个解析的表单值,
  249. //包括URL字段的查询参数和POST或PUT表单数据。
  250. FormValue(name string) string
  251. // FormValues返回已解析的表单数据,包括URL
  252. //字段的查询参数和POST或PUT表单数据。
  253. //默认表单的内存最大大小为32MB,可以通过更改
  254. //在主要配置中的`iris#WithPostMaxMemory`配置器传递给`app.Run`的第二个参数。
  255. //注意:需要检查nil。
  256. FormValues() map[string][]string
  257. // PostValueDefault从POST,PATCH返回解析后的表单数据
  258. //或基于“名称”的PUT身体参数。
  259. //如果没有找到返回设定的def
  260. // If not found then "def" is returned instead.
  261. PostValueDefault(name string, def string) string
  262. // PostValue从POST,PATCH返回解析后的表单数据
  263. //或基于“名称”的PUT身体参数
  264. PostValue(name string) string
  265. // PostValueTrim从POST,PATCH返回解析后的表单数据
  266. //或PUT基于“名称”的体参数,没有尾随空格。
  267. PostValueTrim(name string) string
  268. // PostValueInt从POST,PATCH返回解析后的表单数据
  269. //或PUT基于“名称”的体参数,如int。
  270. //如果未找到则返回-1并返回非nil错误。
  271. PostValueInt(name string) (int, error)
  272. // PostValueIntDefault从POST,PATCH返回解析后的表单数据
  273. //或PUT基于“名称”的体参数,如int
  274. //如果没有找到返回设定的def
  275. PostValueIntDefault(name string, def int) int
  276. // PostValueInt64从POST,PATCH返回解析后的表单数据,
  277. //或PUT基于“名称”的体参数,如float64。
  278. // 如果未找到则返回-1并返回非nil错误。
  279. PostValueInt64(name string) (int64, error)
  280. // PostValueInt64Default从POST,PATCH返回解析后的表单数据,
  281. //或PUT基于“名称”的体参数,如int64。
  282. //如果没有找到返回设定的def
  283. PostValueInt64Default(name string, def int64) int64
  284. // PostValueFloat64从POST,PATCH返回解析后的表单数据,
  285. //或PUT基于“名称”的体参数,如float64。
  286. // 如果未找到则返回-1并返回非nil错误。
  287. PostValueFloat64(name string) (float64, error)
  288. // PostValueInt64Default从POST,PATCH返回解析后的表单数据,
  289. //或PUT基于“名称”的体参数,如Int64。
  290. //如果没有找到返回设定的def
  291. PostValueFloat64Default(name string, def float64) float64
  292. // PostValueInt64Default从POST,PATCH返回解析后的表单数据,
  293. //或PUT基于“名称”的身体参数,如bool。
  294. //如果未找到或value为false,则返回false,否则返回true。
  295. PostValueBool(name string) (bool, error)
  296. // PostValues从POST,PATCH返回所有已解析的表单数据,
  297. //或PUT体参数基于“名称”作为字符串切片。
  298. //
  299. //默认表单的内存最大大小为32MB,可以通过更改
  300. //在主要配置中的`iris#WithPostMaxMemory`配置器传递给`app.Run`的第二个参数。
  301. PostValues(name string) []string
  302. // FormFile返回从客户端收到的第一个上传文件。
  303. //默认表单的内存最大大小为32MB,可以通过更改
  304. //在主要配置中的`iris#WithPostMaxMemory`配置器传递给`app.Run`的第二个参数。
  305. //示例:https://github.com/kataras/iris/tree/master/_examples/http_request/upload-file
  306. FormFile(key string) (multipart.File, *multipart.FileHeader, error)
  307. // UploadFormFiles从客户端上传任何收到的文件
  308. //到系统物理位置“destDirectory”。
  309. //第二个可选参数“before”为调用者提供了机会
  310. //在保存到磁盘之前修改* miltipart.FileHeader,
  311. //它可以用来根据当前请求更改文件名,
  312. //可以更改所有FileHeader的选项。你可以忽略它
  313. //在将文件保存到磁盘之前,您不需要使用此功能。
  314. //请注意,它不会检查请求正文是否已流式传输。
  315. //将复制的长度返回为int64和
  316. //如果至少有一个新文件,则为非nil错误
  317. //由于操作系统的权限或无法创建//
  318. // http.ErrMissingFile如果没有收到文件。
  319. //如果您想要接收和接受文件并手动管理它们,您可以使用`context#FormFile`
  320. //而是创建一个适合您需要的复制功能,下面是一般用法。
  321. //默认表单的内存最大大小为32MB,可以通过更改
  322. //在主要配置中的`iris#WithPostMaxMemory`配置器传递给`app.Run`的第二个参数。
  323. //参见`FormFile`更受控制以接收文件。
  324. //示例:https://github.com/kataras/iris/tree/master/_examples/http_request/upload-files
  325. UploadFormFiles(destDirectory string, before ...func(Context, *multipart.FileHeader)) (n int64, err error)
  326. // +------------------------------------------------------------+
  327. // | 自定义HTTP错误 |
  328. // +------------------------------------------------------------+
  329. // NotFound使用特定的自定义错误错误处理程序向客户端发出错误404。
  330. //请注意,如果您不想使用下一个处理程序,则可能需要调用ctx.StopExecution()
  331. //被执行下一个处理程序正在iris上执行,因为你可以使用它
  332. //错误代码并将其更改为更具体的错误代码,即
  333. // users:= app.Party(“/ users”)
  334. // users.Done(func(ctx context.Context){if ctx.StatusCode()== 400 {/ * / users * /}的自定义错误代码})
  335. NotFound()
  336. // +------------------------------------------------------------+
  337. // | Body Readers |
  338. // +------------------------------------------------------------+
  339. // SetMaxRequestBodySize设置请求主体大小的限制
  340. //应该在从客户端读取请求主体之前调用。
  341. SetMaxRequestBodySize(limitOverBytes int64)
  342. // UnmarshalBody读取请求的正文并将其绑定到任何类型的值或指针。
  343. //用法示例:context.ReadJSON,context.ReadXML。
  344. //例如: https://github.com/kataras/iris/blob/master/_examples/http_request/read-custom-via-unmarshaler/main.go
  345. UnmarshalBody(outPtr interface{}, unmarshaler Unmarshaler) error
  346. // ReadJSON从请求的主体读取JSON,并将其绑定到任何json-valid类型的值的指针。
  347. // 例如: https://github.com/kataras/iris/blob/master/_examples/http_request/read-json/main.go
  348. ReadJSON(jsonObjectPtr interface{}) error
  349. // ReadXML从请求的正文中读取XML,并将其绑定到任何xml-valid类型值的指针。
  350. // 例如: https://github.com/kataras/iris/blob/master/_examples/http_request/read-xml/main.go
  351. ReadXML(xmlObjectPtr interface{}) error
  352. // ReadForm将formObject与表单数据绑定在一起
  353. //它支持任何类型的结构。
  354. // Example: https://github.com/kataras/iris/blob/master/_examples/http_request/read-form/main.go
  355. ReadForm(formObjectPtr interface{}) error
  356. // +------------------------------------------------------------+
  357. // | Body (raw) Writers |
  358. // +------------------------------------------------------------+
  359. // Write将数据作为HTTP回复的一部分写入连接。
  360. //如果尚未调用WriteHeader,则写入调用
  361. //在写入数据之前写入WriteHeader(http.StatusOK)。如果是标题
  362. //不包含Content-Type行,Write添加Content-Type集
  363. //将最初的512字节写入数据传递给的结果
  364. // DetectContentType。
  365. //根据HTTP协议版本和客户端,调用
  366. // Write或WriteHeader可能会阻止将来读取
  367. // Request.Body。对于HTTP / 1.x请求,处理程序应该读取任何内容
  368. //在编写响应之前需要请求正文数据。一旦
  369. //标头已被刷新(由于显式的Flusher.Flush
  370. //调用或写入足够的数据来触发刷新),即请求体
  371. //可能无法使用对于HTTP / 2请求,Go HTTP服务器允许
  372. //处理程序在同时继续读取请求体
  373. //写回复但是,可能不支持此类行为
  374. //由所有HTTP / 2客户端。处理者应在写作前阅读
  375. //可以最大化兼容性。
  376. Write(body []byte) (int, error)
  377. // Writef根据格式说明符格式化并写入响应。
  378. //返回写入的字节数和遇到的任何写入错误。
  379. Writef(format string, args ...interface{}) (int, error)
  380. // WriteString将一个简单的字符串写入响应。
  381. //返回写入的字节数和遇到的任何写入错误。
  382. WriteString(body string) (int, error)
  383. // SetLastModified根据“modtime”输入设置“Last-Modified”。
  384. //如果“modtime”为零,那么它什么都不做。
  385. //它主要内部在核心/路由器和上下文包上。
  386. //注意正在使用modtime.UTC()而不仅仅是modtime,所以
  387. //你不必知道内部结构才能使其有效。
  388. SetLastModified(modtime time.Time)
  389. // CheckIfModifiedSince检查自“modtime”以来是否修改了响应。
  390. //请注意,它与服务器端缓存无关。
  391. //它通过检查“If-Modified-Since”请求标头来执行这些检查
  392. //由客户端或以前的服务器响应头发送
  393. //(例如WriteWithExpiration或StaticEmbedded或Favicon等)
  394. //是有效的,它在“modtime”之前。
  395. //检查!modtime && err == nil是必要的,以确保
  396. //它没有被修改,因为它可能会返回false而不是偶数
  397. //由于某些错误,有机会检查客户端(请求)标头,
  398. //喜欢HTTP方法不是“GET”或“HEAD”或者“modtime”是零
  399. //或者从头部解析时间失败。
  400. //它主要用于内部,例如`环境#WriteWithExpiration`。
  401. //注意正在使用modtime.UTC()而不仅仅是modtime,所以
  402. //你不必知道内部结构才能使其有效。
  403. CheckIfModifiedSince(modtime time.Time) (bool, error)
  404. // WriteNotModified向客户端发送304“未修改”状态代码,
  405. //它确保内容类型,内容长度标题
  406. //在发送响应之前删除任何“ETag”。
  407. //它主要在core / router / fs.go和context方法的内部使用。
  408. WriteNotModified()
  409. // WriteWithExpiration类似于Write但它发送的是到期日期时间
  410. //刷新每个包级别的“StaticCacheDuration”字段。
  411. WriteWithExpiration(body []byte, modtime time.Time) (int, error)
  412. // StreamWriter注册给定的流编写器以进行填充
  413. //回复正文
  414. //禁止从作者访问上下文和/或其成员。
  415. //此功能可用于以下情况:
  416. // *如果响应主体太大(超过iris.LimitRequestBodySize(如果已设置))。
  417. // *如果响应正文从缓慢的外部源流式传输。
  418. // *如果必须以块的形式将响应主体流式传输到客户端。
  419. //(又名`http server push`)。
  420. //接收一个接收响应编写器的函数
  421. //并在它应该停止写入时返回false,否则为true以便继续
  422. StreamWriter(writer func(w io.Writer) bool)
  423. // +------------------------------------------------------------+
  424. // | Body Writers with compression |
  425. // +------------------------------------------------------------+
  426. //如果客户端支持gzip压缩,则ClientSupportsGzip重新为true。
  427. ClientSupportsGzip() bool
  428. // WriteGzip接受字节,压缩为gzip格式并发送到客户端。
  429. //返回写入的字节数和错误(如果客户端不支持gzip压缩)
  430. //您可以在同一个处理程序中重用此函数
  431. //多次写入更多数据,没有任何麻烦
  432. WriteGzip(b []byte) (int, error)
  433. // TryWriteGzip接受字节,压缩为gzip格式并发送到客户端。
  434. //如果客户端不支持gzip,则内容按原样写入,未压缩。
  435. TryWriteGzip(b []byte) (int, error)
  436. // GzipResponseWriter将当前响应编写器转换为响应编写器
  437. //当它的.Write调用它时,将数据压缩为gzip并将它们写入客户端。
  438. //
  439. //也可以使用.Disable和.ResetBody来禁用它以回滚到通常的响应编写器。
  440. GzipResponseWriter() *GzipResponseWriter
  441. //如果客户端,Gzip启用或禁用(如果在之前启用)gzip响应编写器
  442. //支持gzip压缩,因此以下响应数据将会
  443. //作为压缩的gzip数据发送到客户端。
  444. Gzip(enable bool)
  445. // +------------------------------------------------------------+
  446. // | Rich Body Content Writers/Renderers |
  447. // +------------------------------------------------------------+
  448. // ViewLayout在.View时设置“layout”选项
  449. //后来在同一个请求中被调用。
  450. //当需要根据链中的先前处理程序设置或/和更改布局时很有用。
  451. //
  452. //注意'layoutTmplFile'参数可以设置为iris.NoLayout || view.NoLayout
  453. //禁用特定视图渲染操作的布局,
  454. //它会禁用引擎配置的布局属性。
  455. // Look .ViewData and .View too.
  456. // Example: https://github.com/kataras/iris/tree/master/_examples/view/context-view-data/
  457. ViewLayout(layoutTmplFile string)
  458. // ViewData保存一个或多个键值对,以便在.View时传递
  459. //后来在同一个请求中被调用。
  460. //当需要设置或/和更改链中先前hanadler的模板数据时很有用。
  461. //如果.View的“绑定”参数不是nil而且它不是一种地图
  462. //然后忽略这些数据,绑定具有优先级,因此主路径的处理程序仍然可以决定。
  463. //如果绑定是map或context.Map,那么这些数据将被添加到视图数据中
  464. //并传递给模板。
  465. //在.View之后,数据不会被销毁,以便在需要时重新使用(同样,在与其他所有相同的请求中),
  466. //清除视图数据,开发人员可以调用:
  467. // ctx.Set(ctx.Application()。ConfigurationReadOnly()。GetViewDataContextKey(),nil)
  468. //如果'key'为空,则将值添加为(struct或map),并且开发人员无法添加其他值。
  469. // Look .ViewLayout and .View too.
  470. // Example: https://github.com/kataras/iris/tree/master/_examples/view/context-view-data/
  471. ViewData(key string, value interface{})
  472. // GetViewData返回`context #ViewData`注册的值。
  473. //返回值是`map [string] interface {}`,这意味着
  474. //如果一个自定义结构注册到ViewData那么这个函数
  475. //将尝试解析它以进行映射,如果失败则返回值为nil
  476. //如果不同,检查零是一个很好的做法
  477. //通过`ViewData`注册了一些值或没有数据。
  478. //类似于这样 `viewData := ctx.Values().Get("iris.viewData")` 或者
  479. //`viewData := ctx.Values().Get(ctx.Application().ConfigurationReadOnly().GetViewDataContextKey())`.
  480. GetViewData() map[string]interface{}
  481. // View根据注册的视图引擎呈现模板。
  482. //第一个参数接受相对于视图引擎的目录和扩展名的文件名,
  483. //即:如果目录是“./templates”并想要呈现“./templates/users/index.html”
  484. //然后你传递“users / index.html”作为文件名参数。
  485. //第二个可选参数可以接收单个“视图模型”
  486. //如果它不是nil,它将绑定到视图模板,
  487. //否则会检查`ViewData`存储的先前视图数据
  488. //即使存储在任何先前的handlerv(中间件)中,也存在相同的请求。
  489. //也看.ViewData`和.ViewLayout。
  490. //示例:https://github.com/kataras/iris/tree/master/_examples/view
  491. View(filename string, optionalViewModel ...interface{}) error
  492. // 二进制将原始字节写为二进制数据。
  493. Binary(data []byte) (int, error)
  494. // Text将字符串写为纯文本。
  495. Text(text string) (int, error)
  496. // HTML将字符串写为 text/html。
  497. HTML(htmlContents string) (int, error)
  498. // JSON 整理给定的接口对象并写入JSON响应。
  499. JSON(v interface{}, options ...JSON) (int, error)
  500. // JSONP 整理给定的接口对象并写入JSON响应
  501. JSONP(v interface{}, options ...JSONP) (int, error)
  502. // XML 整理给定的接口对象并写入xml响应.
  503. XML(v interface{}, options ...XML) (int, error)
  504. //Markdown 将markdown解析为html并将其结果呈现给客户端。
  505. Markdown(markdownB []byte, options ...Markdown) (int, error)
  506. // 用yaml解析器解析“v”并将其结果呈现给客户端。
  507. YAML(v interface{}) (int, error)
  508. // +------------------------------------------------------------+
  509. // | Serve files |
  510. // +------------------------------------------------------------+
  511. // ServeContent提供内容,标题是自动设置的
  512. //接收三个参数,它是低级函数,而不是你可以使用.ServeFile(string,bool)/ SendFile(string,string)
  513. //在此函数调用之前,您可以使用`context#ContentType`定义自己的“Content-Type”。
  514. //此函数不支持恢复(按范围),
  515. //使用ctx.SendFile或路由器的`StaticWeb`代替。
  516. ServeContent(content io.ReadSeeker, filename string, modtime time.Time, gzipCompression bool) error
  517. // ServeFile提供一个文件(例如发送一个文件,一个zip到客户端你应该使用`SendFile`)
  518. //接收两个参数
  519. //文件名/路径(字符串)
  520. // gzipCompression(bool)
  521. //在此函数调用之前,您可以使用`context#ContentType`定义自己的“Content-Type”。
  522. //
  523. //此函数不支持恢复(按范围),
  524. //使用ctx.SendFile或路由器的`StaticWeb`代替。
  525. //当您想要向客户端提供动态文件时使用它。
  526. ServeFile(filename string, gzipCompression bool) error
  527. // SendFile将文件强制下载发送到客户端
  528. //使用此代替ServeFile来“强制下载”更大的文件到客户端。
  529. SendFile(filename string, destinationName string) error
  530. // +------------------------------------------------------------+
  531. // | Cookies |
  532. // +------------------------------------------------------------+
  533. // SetCookie添加了一个cookie
  534. SetCookie(cookie *http.Cookie)
  535. // SetCookieKV添加一个cookie,只接收一个名字(字符串)和一个值(字符串)
  536. //如果您使用此方法,它将在2小时后到期
  537. //如果要更改更多字段,请使用ctx.SetCookie或http.SetCookie。
  538. SetCookieKV(name, value string)
  539. // GetCookie按名称返回cookie的值
  540. //如果没有找到,则返回空字符串。
  541. GetCookie(name string) string
  542. // RemoveCookie按名称删除cookie。
  543. RemoveCookie(name string)
  544. // VisitAllCookies接受一个循环的访问者
  545. //在每个(请求的)cookie的名称和值上。
  546. VisitAllCookies(visitor func(name string, value string))
  547. // MaxAge返回“缓存控制”请求标头的值
  548. //秒为int64
  549. //如果未找到标头或解析失败,则返回-1。
  550. MaxAge() int64
  551. // +------------------------------------------------------------+
  552. // | Advanced: Response Recorder and Transactions |
  553. // +------------------------------------------------------------+
  554. // Record将上下文的基本和直接responseWriter转换为ResponseRecorder
  555. //可用于重置body,重置标头,获取body,
  556. //随时随地获取和设置状态代码。
  557. Record()
  558. // Recorder返回上下文的ResponseRecorder
  559. //如果没有录制,则开始录制并返回新上下文的ResponseRecorder
  560. Recorder() *ResponseRecorder
  561. // IsRecording返回响应记录器和真值
  562. //当响应作者正在记录状态代码,正文,标题等时,
  563. // else返回nil和false。
  564. IsRecording() (*ResponseRecorder, bool)
  565. / BeginTransaction启动范围内的事务。
  566. //您可以搜索有关业务交易如何运作的第三方文章或书籍(这很简单,尤其是在这里)。
  567. //请注意,这是独一无二的
  568. //(=我在Golang上从未见过关于此主题的任何其他示例或代码,到目前为止,与大多数虹膜功能一样......)
  569. //它不包括所有路径
  570. //例如数据库,这应该由用于建立数据库连接的库来管理,
  571. //此事务范围仅用于上下文的响应。
  572. //交易也有自己的中间件生态系统,看看iris.go:UseTransaction。
  573. // 参考 https://github.com/kataras/iris/tree/master/_examples/ for more
  574. BeginTransaction(pipe func(t *Transaction))
  575. //如果调用SkipTransactions,则跳过其余的事务
  576. //如果在第一次交易之前调用,则为全部
  577. SkipTransactions()
  578. //如果事务被跳过或取消,则TransactionsSkipped返回true。
  579. TransactionsSkipped() bool
  580. // Exec调用`context / Application #ServeCtx`
  581. //基于此上下文但具有更改的方法和路径
  582. //喜欢它是用户请求的,但事实并非如此。
  583. //
  584. //离线表示路由已注册到虹膜,并具有正常路由所具有的所有功能
  585. //但它不能通过浏览获得,它的处理程序仅在其他处理程序的上下文调用它们时执行
  586. //它可以验证路径,有会话,路径参数等等。
  587. //你可以通过app.GetRoute找到路线(“theRouteName”)
  588. //您可以将路径名称设置为:myRoute:= app.Get(“/ mypath”,handler)(“theRouteName”)
  589. //将为路由设置名称并返回其RouteInfo实例以供进一步使用。
  590. //它不会更改全局状态,如果路由处于“离线状态”,它将保持脱机状态。
  591. // app.None(...)和app.GetRoutes()。离线(路线)/。在线(路线,方法)
  592. //示例:https://github.com/kataras/iris/tree/master/_examples/routing/route-state
  593. //用户可以通过简单的使用rec:= ctx.Recorder()获得响应; rec.Body()/ rec.StatusCode()/ rec.Header()。
  594. //保留Context的值和Session,以便能够通过结果路由进行通信。
  595. //这是针对极端用例的,99%的情况永远不会对你有用。
  596. Exec(method, path string)
  597. // RouteExists报告特定路由是否存在
  598. //如果不在根域内 ,它将从上下文主机的当前子域搜索。
  599. RouteExists(method, path string) bool
  600. // Application返回属于此上下文的iris app实例。
  601. //值得注意的是这个函数返回一个接口
  602. //应用程序,包含安全的方法
  603. //在服务时间执行。完整的应用程序的字段
  604. //这里没有方法可供开发人员使用。
  605. Application() Application
  606. // String返回此请求的字符串表示形式。
  607. //每个上下文都有一个唯一的字符串表示
  608. //它可以用于简单的调试场景,即打印上下文为字符串。
  609. //它返回什么?一个声明长度的数字
  610. //跟随每个可执行应用程序的总`String`调用
  611. //通过远程IP(客户端),最后是方法:url。
  612. String() string
  613. }