返回值必須返回一個 rev.Result, 它處理response的生成並依附於一個簡單的接口:
type Result interface { Apply(req *Request, resp *Response) }
rev.Controller 提供幾個方法來生成結果:
- Render, RenderTemplate - 渲染一個模板, 傳遞參數.
- RenderJson, RenderXml - 序列化一個結構的json或xml.
- RenderText - 返回一個純文本response.
- Redirect - 重定向到另一個action或URL
- RenderFile - 返回一個文件, 通常作為一個附件下載.
- RenderError - 返回一個 500 response 它渲染 errors/500.html 模板.
- NotFound - 返回一個 404 response 它渲染 errors/404.html 模板.
- Todo - 返回一個 stub response (500)
此外,開發人員可以定義他們自己的rev.Result並返回它.
設置狀態碼 / Content Type
每一個內建的結果都有一個默認的狀態碼和Content Type. 要重寫它們的值只需在response時簡單的設置那些要改變的屬性:
func (c Application) Action() rev.Result { c.Response.Status = http.StatusTeapot c.Response.ContentType = "application/dishware" return c.Render() }
渲染
render在action中被調用, mvc.Controller.Render 做了兩件事情:
- 添加全部的參數到controller的RenderArgs. 使用他們的本地標示符作為key.
- 執行模板“views/Controller/Action.html”, 傳入controller的RenderArgs作為數據字典.
如果不成功(例如它不能找到模板文件), 它將返回一個ErrorResult替換.
允許開發人員這樣寫:
func (c MyApp) Action() rev.Result { myValue := calculateValue() return c.Render(myValue) }
在他們的模板中使用"myValue". 這通常比顯式的構造一個字典更方便, 因為在很多的案例中數據將需要作為本地變量來處理.
注意:Revel通過調用的方法名稱來決定模板路徑和查找的參數名稱.因此, c.Render()可能只能從action中調用.
RenderJson / RenderXml
應用程序可以調用 RenderJson 或 RenderXml 來傳入任意的Go類型(通常是一個struct). Revel將用json.Marshal 或 xml.Marshal來序列化它.
如果results.pretty=true在app.conf中, 序列化將使用MarshalIndent來完成, 以便輸出更優雅的帶縮進的比較利於人們查看的版本.
Redirect
一個幫助函數提供了重定向. 它可以被用於兩種方式.
1. 重定向一個不帶參數的Action
return c.Redirect(Hotels.Settings)
這種形式對提供一個深度的類型安全和獨立的路由很有幫助.(它生成自動的URL)
2. 重定向到一個格式化字符串
return c.Redirect("/hotels/%d/settings", hotelId)
這種形式需要必要的參數傳遞.
它返回一個302(臨時跳轉)狀態碼.
添加你自己的Result
下面是一個添加簡單Result的示例.
創建類型:
type Html string func (r Html) Apply(req *Request, resp *Response) { resp.WriteHeader(http.StatusOK, "text/html") resp.Out.Write([]byte(r)) }
然后在action中使用它
func (c *Application) Action() rev.Result { return Html("<html><body>Hello World</body></html>") }
狀態碼
每一個Result將默認設置一個狀態碼.你能通過設置一個你自己的來重寫這個默認的狀態碼.
func (c *Application) CreateEntity() rev.Result { c.Response.Status = 201 return c.Render() }
至此結束.
