企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] ## 获取Get请求参数 > 例子:/path?id=1234&name=Manu&sex=male > 获取Get请求参数的常用函数: > `func (c *Context) Query(key string) string` > `func (c *Context) DefaultQuery(key, defaultValue string) string` > `func (c *Context) GetQuery(key string) (string, bool)` ~~~ func DoHandler(c *gin.Context) { //获取name参数, 通过Query获取的参数值是String类型。 name := c.Query("name") //获取name参数, 跟Query函数的区别是,可以通过第二个参数设置默认值。 name := c.DefaultQuery("name", "golang") //获取id参数, 通过GetQuery获取的参数值也是String类型, // 区别是GetQuery返回两个参数,第一个是参数值,第二个参数是参数是否存在的bool值,可以用来判断参数是否存在。 id, ok := c.GetQuery("id") if !ok { // 参数不存在 } } ~~~ > 提示:GetQuery函数,判断参数是否存在的逻辑是,参数值为空,参数也算存在,只有没有提交参数,才算参数不存在。 ## 获取Post请求参数 > 获取Post请求参数的常用函数: > `func (c *Context) PostForm(key string) string` > `func (c *Context) DefaultPostForm(key, defaultValue string) string` > `func (c *Context) GetPostForm(key string) (string, bool)` ~~~ func DoHandler(c *gin.Context) { //获取name参数, 通过PostForm获取的参数值是String类型。 name := c.PostForm("name") // 跟PostForm的区别是可以通过第二个参数设置参数默认值 name := c.DefaultPostForm("name", "golang") //获取id参数, 通过GetPostForm获取的参数值也是String类型, // 区别是GetPostForm返回两个参数,第一个是参数值,第二个参数是参数是否存在的bool值,可以用来判断参数是否存在。 id, ok := c.GetPostForm("id") if !ok { // 参数不存在 } } ~~~ ## 获取URL路径参数 > 例子:/user/:id/:name > 获取url路径参数常用函数: > `func (c *Context) Param(key string) string` ~~~ r := gin.Default() r.GET("/user/:id/:name", func(c *gin.Context) { // 获取url的绑定参数 id := c.Param("id") name := c.Param("name") }) ~~~ ## 将请求参数绑定到struct对象 > 前面获取参数都是一个个的读取方式,比较麻烦,Gin框架支持将请求参数自动绑定到一个struct对象,这种方式支持Get/Post请求,也支持http请求body内容为json/xml格式的参数。 **User struct对象:** ~~~ // User 结构体定义 type User struct { Name string `json:"name" form:"name"` Email string `json:"email" form:"email"` } ~~~ **struct标签说明:** | 标签 | 说明 | | --- | --- | | json:"name" | 数据格式为json格式,并且json字段名为name | | form:"name" | 表单参数名为name | > 提示:你可以根据自己的需要选择支持的数据类型,例如需要支持json数据格式,可以这样定义字段标签: json:"name" **控制器代码:** ~~~ r.GET("/user", func(c *gin.Context) { // 初始化user struct u := User{} // 通过ShouldBind函数,将请求参数绑定到struct对象, 处理json请求代码是一样的。 // 如果是post请求则根据Content-Type判断,接收的是json数据,还是普通的http请求参数 if c.ShouldBind(&u) == nil { // 绑定成功, 打印请求参数 log.Println(u.Name) log.Println(u.Email) } // http 请求返回一个字符串 c.String(200, "Success") }) ~~~ ## Gin如何获取客户ip ~~~ r.GET("/ip", func(c *gin.Context) { // 获取用户IP ip := c.ClientIP() }) ~~~