Go Revel - Results(响应)
每个Action
必须返回一个revel.Result
实例,用来处理响应。它遵循了简单的接口:
type Result interface {
Apply(req *Request, resp *Response)
}
revel.Controller
提供了一些方法来生成Results
响应:
1、Render
, RenderTemplate
- 渲染模板, 传递参数
2、RenderJson
, RenderXml
- 将一个struct
序列化为json
或xml
格式
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类型来调用RenderJson
或RenderXml
,revel将通过json.Marshal
或xml.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()
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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的设计模式综述