Go Revel - Results(响应)

每个Action必须返回一个revel.Result实例,用来处理响应。它遵循了简单的接口:

type Result interface {
    Apply(req *Request, resp *Response)
}

revel.Controller提供了一些方法来生成Results响应:

1、Render, RenderTemplate - 渲染模板, 传递参数

2、RenderJson, RenderXml - 将一个struct序列化为jsonxml格式

3、RenderText - 返回一个纯文本响应

4、Redirect - 重定向到另一个action或URL

5、RenderFile - 返回一个文件, 一般作为一个附件下载

6、RenderError - 渲染errors/500.html模板来返回一个500状态

7、NotFound - 渲染errors/404.html模板来返回一个404状态

8、Todo - 返回一个存根响应 (500)

除此之外,开发人员还可以返回自己定义的revel.Result

设置状态码与返回体

每一个内建的Result都有默认的状态码与返回体,如果要手动改变,只需要简单的覆盖response中的属性即可:

func (c App) Action() revel.Result {
    c.Response.Status = http.StatusTeapot
    c.Response.ContentType = "application/dishware"
    return c.Render()
}

Render(渲染器)

在一个action内调用(如,Controller.Action)。mvc.Controller.Render可以做如下两件事:

1、将所有参数添加至controller的RenderArgs,并将它们的本地标识设置为key

2、渲染模板views/Controller/Action.html, 并将RenderArgs作为一个map传递

如果不成功,比如没找到模板,它会返回一个ErrorResult对象。

func (c MyApp) Action() revel.Result {
    myValue := calculateValue()
    return c.Render(myValue)
}

上面示例将myValue传递至模板。

revel需要根据调用者的方法名来确定模板的路径与参数,因此c.Render()只能在Action中调用。

渲染 Json / Xml

程序可以通过传递任意Go类型来调用RenderJsonRenderXml,revel将通过json.Marshalxml.Marshal来渲染。

如果app.conf中的results.pretty=true被定义,则将使用MarshalIndent进行序列化,以惨生更好的缩进供人阅读。

Redirect(重定向)

revel提供了一下两种方式来进行重定向:

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 *App) Action() revel.Result {
    return Html("Hello World")
}

状态码

没一个Result都具有默认的状态码,可以很方便的更改它:

func (c *App) CreateEntity() revel.Result {
    c.Response.Status = 201
    return c.Render()
}

posted on   黑暗伯爵  阅读(1494)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示