Go Web開發之Revel - 返回值


返回值必須返回一個 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 做了兩件事情:

  1. 添加全部的參數到controller的RenderArgs. 使用他們的本地標示符作為key.
  2. 執行模板“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()
}

 

至此結束.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM