相关方法: https://pkg.go.dev/github.com/gogf/gf/v2/net/ghttp#Request
简要说明
可以看到Request
对象的参数获取方法非常丰富,可以分为以下几类:
Get*
: 常用方法,简化参数获取,GetRequest*
的别名。GetQuery*
: 获取GET
方式传递过来的参数,包括Query String
及Body
参数解析。GetForm*
: 获取表单方式传递过来的参数,表单方式提交的参数Content-Type
往往为application/x-www-form-urlencoded
,application/form-data
,multipart/form-data
,multipart/mixed
等等。GetRequest*
: 获取客户端提交的参数,不区分提交方式。Get*Struct
: 将指定类型的请求参数绑定到指定的struct
对象上,注意给定的参数为对象指针。绝大部分场景中往往使用Parse
方法将请求数据转换为请求对象,具体详见后续章节。GetJson
: 自动将原始请求信息解析为gjson.Json
对象指针返回,gjson.Json
对象具体在 通用编解码-gjson 章节中介绍。Exit*
: 用于请求流程退出控制,详见本章后续说明;
提交方式
GoFrame
框架的参数获取不是通过HTTP Method
来做区分,而是通过参数提交类型来区分。例如,分别通过HTTP Method: POST、INPUT、DELETE
来提交表单参数,在服务端获取参数不是通过GetPost
/GetInput
/GetDelete
的方式来获取,而是统一通过GetForm
方法来获取表单参数,针对其他的HTTP Method
也是如此。
Router
: 路由参数,来源于路由规则匹配。Query
:URL
中的Query String
参数解析,如:[http://127.0.0.1/index?id=1&name=john](http://127.0.0.1/index?id=1&name=john)
中的id=1&name=john
。Form
: 表单提交参数,最常见的提交方式,提交的Content-Type
往往为:application/x-www-form-urlencoded
、multipart/form-data
、multipart/mixed
。Body
: 原始提交内容,从Body
中获取并解析得到的参数,JSON
/XML
请求往往使用这种方式提交。Custom
: 自定义参数,往往在服务端的中间件、服务函数中通过SetParam/GetParam
方法管理。
参数类型
获取的参数方法可以对指定键名的数据进行自动类型转换,例如:[http://127.0.0.1:8199/?amount=19.66](http://127.0.0.1:8199/?amount=19.66)
,通过GetQueryString
将会返回19.66
的字符串类型,GetQueryFloat32
/GetQueryFloat64
将会分别返回float32
和float64
类型的数值19.66
。但是,GetQueryInt
/GetQueryUint
将会返回19
(如果参数为float
类型的字符串,将会按照向下取整进行整型转换)。
变量类型的获取方法仅提供了常用类型的直接获取方法,如果有更多参数类型转换的需求,可以使用Get*Var
参数获取方法,获得*gvar.Var
变量再进行相应类型转换。例如,假如我们要获取一个int8
类型的参数,我们可以这样GetVar("id").Int8()
。
使用示例:
参数优先级
我们考虑一种场景,当不同的提交方式中存在同名的参数名称会怎么样?在GoFrame
框架下,我们根据不同的获取方法,将会按照不同的优先级进行获取,优先级高的方式提交的参数将会优先覆盖其他方式的同名参数。优先级规则如下:
Get*
及GetRequset*
方法:Router < Query < Body < Form < Custom
,也就是说自定义参数的优先级最高,其次是表单参数,再次是Body
提交参数,以此类推。例如,Query
和Form
中都提交了同样名称的参数id
,参数值分别为1
和2
,那么Get("id")
/GetForm("id")
将会返回2
,而GetQuery("id")
将会返回1
。GetForm*
方法:由于该类型的方法仅用于获取Form
表单参数,因此没什么优先级的差别。
使用示例:
执行后,我们通过curl
工具进行测试:
继续了解: