Results

最后更新于:2022-04-01 04:22:00

控制器方法必须返回一个[`revel.Result`](http://gorevel.cn/docs/docs/godoc/results.html#Result), 用来处理响应结果,其接口定义如下: ~~~ type Result interface { Apply(req *Request, resp *Response) } ~~~ [`revel.Controller`](http://gorevel.cn/docs/docs/godoc/controller.html#Controller) 使用以下方法来处理响应结果: * Render, RenderTemplate - 渲染模板, 传送参数. * RenderJson, RenderXml - 序列化结构体到 json 或 xml. * RenderText - 返回一个明文响应. * Redirect - 重定向到一个控制器方法 或 URL * RenderFile - 返回一个文件, 一般用于响应文件下载. * RenderError - 渲染 errors/500.html 模板来返回一个 500 错误. * NotFound - 渲染 errors/404.html 模板来返回一个 404 错误. * Todo - 返回一个存根响应(500) 此外,开发者可以自定义revel.Result. ### 设置状态码/内容类型 每个内建的 Result 都有一个默认的状态码和内容类型,简单的设置相关属性就可以修改这些默认值: ~~~ func (c App) Action() revel.Result { c.Response.Status = http.StatusTeapot c.Response.ContentType = "application/dishware" return c.Render() } ~~~ ## 渲染 控制器渲染方法 (e.g. “Controller.Action”), [`mvc.Controller.Render`](http://gorevel.cn/docs/docs/godoc/controller.html#Controller.Render) 做了两件事: 1. 添加参数到控制器的 RenderArgs 中, 使用变量的名字作为字典的key. 2. 使用传送的参数渲染模板 “views/Controller/Action.html”。 如果不成功 (比如,没有找到模板), 将返回 ErrorResult. 这允许开发人员编写: ~~~ func (c MyApp) Action() revel.Result { myValue := calculateValue() return c.Render(myValue) } ~~~ 在模板中引用变量 “myValue”。这通常比构建一个明确的map更方便,因为在许多情况下,数据将被作为局部变量处理。 **注意:** Revel 通过调用的控制器方法名来确定使用哪个模板,查找参数名。因此, c.Render() 只可称为由操作。 ## RenderJson / RenderXml 应用程序可以调用 [`RenderJson`](http://gorevel.cn/docs/docs/godoc/controller.html#Controller.RenderJson) 或 [`RenderXml`](http://gorevel.cn/docs/docs/godoc/controller.html#Controller.RenderXml) 并传送任意类型的变量 (通常是一个 struct). Revel 会使用 [`json.Marshal`](http://www.golang.org/pkg/encoding/json/#Marshal) or[`xml.Marshal`](http://www.golang.org/pkg/encoding/xml/#Marshal)对变量进行序列化操作. 如果 `app.conf` 配置文件中 `results.pretty=true`, 将使用 `MarshalIndent` 进行序列化, 生成漂亮的缩进,方便使用。 ## 重定向 一个辅助函数是用于生成重定向。它有两种方式使用: 1. 重定向到一个控制器方法(不带参数): ~~~ return c.Redirect(Hotels.Settings) ~~~ 这种形式是非常有用的,因为它提供了一定程度的路由类型安全性和独立性(自动生成URL)。 1. 重定向到一个格式化字符串: ~~~ return c.Redirect("/hotels/%d/settings", hotelId) ~~~ 通常用来传送参数. 它返回 302 (临时重定向) 状态码. ## 添加你自己的 Result 下面是一个添加简单结果的例子。 创建此类型: ~~~ type Html string func (r Html) Apply(req *Request, resp *Response) { resp.WriteHeader(http.StatusOK, "text/html") resp.Out.Write([]byte(r)) } ~~~ 在一个控制器方法中使用它: ~~~ func (c *App) Action() revel.Result { return Html("<html><body>Hello World</body></html>") } ~~~ ## 状态码 每一个Result 都会设置一个默认的状态码,你也可以重新设置默认的状态代码: ~~~ func (c *App) CreateEntity() revel.Result { c.Response.Status = 201 return c.Render() } ~~~
';