Go Revel - Parameters(参数绑定)

参数绑定

Revel框架会尽可能的将提交参数转换为期望的Go类型。这个从一个字符串提交参数转换为另一个类型被称为数据绑定 。

参数

所有的请求参数被存放在一个Params中,他包括:

URL路径参数
URL查询参数
表单值(或Multipart)
文件上传

这是Params的定义:

type Params struct {
url.Values
Files map[string][]*multipart.FileHeader
}

嵌入的url.Values提供了对简单值的访问,但开发者会发现非字符的值使用revel的数据绑定机制也非常容易。

Action参数

Params中的参数可以当作方法参数被Action接收。例如:

func (c AppController) Action(name string, ids []int, user User, img []byte) revel.Result {
...
}

在调用之前,revel会使用Binder绑定器将提交的参数按名称转换为期望类型,如果转换不成功,将会用期望类型的0值代替。

Binder绑定器

绑定一个提交参数至期望的类型。

func (c SomeController) Action() revel.Result {
var ids []int
c.Params.Bind(&ids, "ids")
...
}

以下的数据类型支持开箱转换:

任意宽度的int整数
Bool类型
任意支持类型的指针
任意支持类型的切片
结构
time.Time 类型的日期与时间
*os.File, []byte, io.Reader, io.ReadSeeker 文件上传用到的

Booleans

字符串值trueon, 与 1 都会被转为true,否则被转为false

Slices

对于slices切片有两种支持: ordered 有序 与 unordered 无序.

有序:

?ids[0]=1
&ids[1]=2
&ids[3]=4

slice中的数据 []int{1, 2, 0, 4}

无序:

?ids[]=1
&ids[]=2
&ids[]=3

slice中的数据 []int{1, 2, 3}

只有struct切片将会使用有序切片

?user[0].Id=1
&user[0].Name=rob
&user[1].Id=2
&user[1].Name=jenny

Structs

struct使用.符号来进行绑定

?user.Id=1
&user.Name=rob
&user.Friends[]=2
&user.Friends[]=3
&user.Father.Id=5
&user.Father.Name=Hermes

将会绑定为:

type User struct {
Id int
Name string
Friends []int
Father User
}

只有可导出字段才能被绑定。

日期与时间

revel内置了SQL标准时间字符串格式[“2006-01-02”, “2006-01-02 15:04”]

可以用如下方法添加其他的时间格式:

func init() {
revel.TimeFormats = append(revel.TimeFormats, "01/02/2006")
}

文件上传

上传的文件可以被绑定为以下任意一种类型:

*os.File
[]byte
io.Reader
io.ReadSeeker

上传使用Go的multipart来处理。上传的数据首先被保存在内存中,当大小超过10MB(默认)时,会保存至临时文件。

当绑定为os.File类型时,revel会默认将上传的文件存储至临时文件,这样相比其他类型,效率比较低。

自定义 Binders

创建自定义Binder绑定器,只需要实现binder接口并且注册。

func myBinder(params Params, name string, typ reflect.Type) reflect.Value {
...
} func init() {
revel.TypeBinders[reflect.TypeOf(MyType{})] = myBinder
}
 
 
分类: Go
标签: golangrevelserver

Go Revel - Parameters(参数绑定)的更多相关文章

  1. WebAPI下的如何实现参数绑定

    本文将概述在WebAPI方式下将如何将参数绑定到一个action方法,包括参数是如何被读取,一系列规则决定特定环境采用的那种绑定方式,文章最后将给出一些实际的例子. Parameter binding ...

  2. .NET链接Oracle 参数绑定问题

    在.NET项目中链接Oracle使用的驱动是 Oracle.ManagedDataAccess.dll ,这里下载 所遇到的问题 使用存储过程一个参数没有问题,发现两个或两个以上会有参数没传过来的现象 ...

  3. WebApi 参数绑定方法

    WebAPI 2参数绑定方法   简单类型参数 Example 1: Sending a simple parameter in the Url 01 02 03 04 05 06 07 08 09 ...

  4. [译]WebAPI下的如何实现参数绑定

    本文将概述在WebAPI方式下将如何将参数绑定到一个action方法,包括参数是如何被读取,一系列规则决定特定环境采用的那种绑定方式,文章最后将给出一些实际的例子. Parameter binding ...

  5. 【Hibernate实战】源码解析Hibernate参数绑定及PreparedStatement防SQL注入原理

        本文采用mysql驱动是5.1.38版本. 本篇文章涉及内容比较多,单就Hibernate来讲就很大,再加上数据库驱动和数据库相关,非一篇文章或一篇专题就能说得完.本文从使用入手在[Spr ...

  6. Python中函数参数类型和参数绑定

    参数类型 Python函数的参数类型一共有五种,分别是: POSITIONAL_OR_KEYWORD(位置参数或关键字参数) VAR_POSITIONAL(可变参数) KEYWORD_ONLY(关键字 ...

  7. springMVC-接收数据-参数绑定

    接收数据-参数绑定 #Method Arguments概观 Same in Spring WebFlux The table below shows supported controller meth ...

  8. 防sql注入之参数绑定 SQL Injection Attacks and Defense 预处理语句与存储过程

    http://php.net/manual/zh/pdo.prepared-statements.php 预处理语句与存储过程 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作 ...

  9. 【工作篇】再次熟悉 SpringMVC 参数绑定

    前言 主要现在项目中使用的参数绑定五花八门的,搞得很头大,例如有些用字符串接收日期,用字符串接受数组等等,完全没有利用好 SpringMVC 的优势,这里自己也总结一下,免得到时又要百度谷歌查找. 以 ...

随机推荐

  1. Entity Framework查询原理

    Entity Framework查询原理 前言 Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Rela ...

  2. 阅读安卓在线(Android)系统源代码

    http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 版权声明:本文博客原创 ...

  3. asp.net web api2.0 ajax跨域解决方案

    asp.net web api2.0 ajax跨域解决方案 Web Api的优缺点就不说了,直接说怎么跨域,我搜了一下,主要是有两种.  一,ASP.NET Web API支持JSONP,分两种 1, ...

  4. 探究Java中Map类

    Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象.       Map的接口       Map---实现Map       Map.Entry--Map的内部 ...

  5. MAC中在eclipse luna上搭建移动平台自动化测试框架(UIAutomator/Appium/Robotium/MonkeyRunner)关键点记录

    这几天因为原来在用的hp laptop的电池坏掉了,机器一不小心就断电,所以只能花时间在自己的macbook pro上重新搭建整套环境,大家都知道搭建环境是个很琐碎需要耐心的事情,特别是当你搭建的安卓 ...

  6. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

  7. 客户端Webview重定向

    今天在客户端的网页中写了句alert的代码,发现执行了两次,后来发现网页的地址写的是http://192.168.14.72/app 客户端Webview加载网页,对于不完全路径会重定向到完全路径,导 ...

  8. gtest框架

    解析gtest框架运行机制   1.前言 Google test是一款开源的白盒单元测试框架,据说目前在Google内部已在几千个项目中应用了基于该框架的白盒测试. 最近的工作是在搞一个基于gtest ...

  9. PHP 13: 类

    原文:PHP 13: 类 Notice: This article is working on progress!本章将介绍PHP类.现在,基本上每种语言都支持面向对象,当然PHP也不列外.PHP在以 ...

  10. PHP 7: PHP 变量和常量的定义

    原文:PHP 7: PHP 变量和常量的定义 本章说说变量的定义.如果对于变量和常量的定义,你会注意几个方面呢?你可能会想到: 如何定义变量,它和C# 等语言有什么不同呢? 变量区分大小写吗? PHP ...