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()
}
Go Revel - Results(响应)的更多相关文章
- OPENCV SVM介绍和自带例子
依据机器学习算法如何学习数据可分为3类:有监督学习:从有标签的数据学习,得到模型参数,对测试数据正确分类:无监督学习:没有标签,计算机自己寻找输入数据可能的模型:强化学习(reinforcement ...
- DRF框架 之基础配置
Vue框架的总结 """ 1.vue如果控制html 在html中设置挂载点.导入vue.js环境.创建Vue对象与挂载点绑定 2.vue是渐进式js框架 3.vue指令 ...
- Django rest_frameword 之项目流程
后端开发软件目录规范 一.Model from django.db import models # Create your models here. # 多表的设计 # 图书 作者 出版社 作者详情表 ...
- DRF框架之视图类
前后端分离的项目 >: pip3 install djangorestframework 一.视图类传递参数给序列化类 视图层:views.py 需求: (1)在视图类中实列化对象是,可以设 ...
- Go Revel 学习指南
Go Revel 学习指南 CONTROLLERS(控制器) Routing(路由)http://www.cnblogs.com/hangxin1940/p/3267065.html Paramete ...
- ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results
原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...
- 来玩Play框架02 响应
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我上一章总结了Play框架的基本使用.这一章里,我将修改和增加响应. HTTP协议 ...
- web api :Action Results in Web API 2
原文:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/action-results Web api 返回 ...
- 解决:jmeter查看结果树的响应数据提示超过最大值Response too large to be displayed
问题:用jmeter做接口测试时,查看结果树的数据没有显示全,给出下面的错误提示 Response too large to be displayed. Size: 1349830 > Max: ...
随机推荐
- 使用mysql innodb 使用5.7的json类型遇到的坑和解决办法
---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp #创建 ...
- WPF 控件事件的一个小坑…
最近想判断一下 Slider 是由鼠标点击而改变值,还是由程序内部代码改变的值,发现鼠标的各种事件比如 MouseDown.MouseUp.MouseLeftButtonDown 什么的,都没有任何反 ...
- SQL Server 2008 添加登录账户 配置权限
首先打开数据库,并以windows身份验证模式扥牢固数据库, 然后在左侧的[对象资源管理器中]展开[安全性]节点,鼠标右键点击节点中的[登录名],在弹出的菜单中单击[新建登录名],弹出如图对话框: 然 ...
- js正则()括号的使用
匹配出现a或者b组合一起至少3次以上/(a|b){3,}/,匹配aaa,bbb,aab,baa,bba,bab等等
- 【小白的CFD之旅】19 来自计算网格的困惑
经过一年的忙碌,终于又到了寒假时间,小白又满状态复活了. 这一年小白学了很多的课程,但是一年下来,小白却感觉脑袋里没留下什么东西,貌似什么东西都在考完试的那一刹那全还回给老师了.这一年学习之余,小白仍 ...
- Python fabric实践操作
前面学习了理论,下面该练练手了.两台机器:10.1.6.186.10.1.6.159.fabric部署在10.1.6.186上面. 1 执行一个简单的task任务,显示两台机器的/home/guol ...
- 【编码】Base64编码
简述 为什么叫Base64?个人理解是,基础的64个字符. 而它的作用?用基础的(可理解为可安全传输的)64个字符,来表示难以表示的二进制或对程序造成干扰的字符. Base64的编码过程 自行编码分析 ...
- android工程导入没有错误,运行提示Unable to instantiate activity ComponentInfo
导入小米clientside_android_sdk的demo OAuth-OpenAuthDemo,点Java Build Path的Libraries内Add External JARs,将oau ...
- 【线程】linux之多线程同步互斥技术
1.同步机制 线程同步机制主要有:互斥量/信号量/条件变量/读写锁等. 2.技术示例 创建2个计数线程A和B,每次计数加1,当为偶数时,A线程计数:当为奇数时,B线程计数. 源码: ...
- 说说Python程序的执行过程
1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...