golang gin框架获取参数的操作

 更新时间:2020年12月21日 20:11  点击:1614

1.获取URL参数

GET请求参数通过URL传递

URL参数可以通过DefaultQuery()或Query()方法获取

DefaultQuery()若参数不存在,返回默认值,Query()若参数不存在,返回空串

user_id := com.StrTo(ctx.Query("user_id")).MustInt64()

page := com.StrTo(ctx.DefaultQuery("page", "1")).MustInt()

2.获取表单参数/获取Request body参数

POST参数放在Request body中

表单传输为post请求,http常见的传输格式为四种:

application/json
application/x-www-form-urlencoded
application/xml
multipart/form-data

表单参数可以通过PostForm()方法获取,该方法默认解析的是x-www-form-urlencoded或from-data格式的参数

page := ctx.Request.PostFormValue("page")

rows := ctx.Request.PostFormValue("rows")

func (r *Request) PostFormValue(key string) string {
 if r.PostForm == nil {
 r.ParseMultipartForm(defaultMaxMemory)
 }
 if vs := r.PostForm[key]; len(vs) > 0 {
 return vs[0]
 }
 return ""
}

package controller
import (
 "bytes"
 "encoding/json"
 "github.com/gin-gonic/gin"
)
func getRequestBody(context *gin.Context, s interface{}) error { //获取request的body
 body, _ := context.Get("json") //转换成json格式
 reqBody, _ := body.(string)
 decoder := json.NewDecoder(bytes.NewReader([]byte(reqBody)))
 decoder.UseNumber() //作为数字而不是float64
 err := decoder.Decode(&s)//从body中获取的参数存入s中
 return err
}
// 获取post接口参数
func GetPostParams(ctx *gin.Context) (map[string]interface{}, error) {
 params := make(map[string]interface{})
 err := getRequestBody(ctx, &params)
 return params, err
}

使用场景:

//打印获取到的参数
type UpdatePassword struct {
 UserId int64 `json:"user_id"`
 LinkbookId string `json:"linkbook_id"`
 OldPassword string `json:"old_password"`
 NewPassword string `json:"new_password"`
}
func UpdateUserPassword(ctx *gin.Context) {
 var updatePassword = UpdatePassword{}
 err := getRequestBody(ctx, &updatePassword)//调用了前面代码块中封装的函数,自己封装的,不是库里的
 if err != nil {
 fmt.Println(err)
 }
 fmt.Println(updatePassword.UserId )
 fmt.Println(updatePassword.LinkbookId )
 fmt.Println(updatePassword.OldPassword )
 fmt.Println(updatePassword.NewPassword )
}

3.获取header参数

Header 是键值对,处理方便,Token一般都存header

简单的token,session Id,cookie id等

// 通过上下文获取header中指定key的内容
func GetHeaderByName(ctx *gin.Context, key string) string {
 return ctx.Request.Header.Get(key)
}

补充:gin之处理form表单获取参数和映射结构体

不管是传递json还是form传值

注意 ,在结构体定义时 首字母必须大写

//定义结构体
Id int form:"id"
Name string form:"name"
//获取和绑定参数
id := context.Query(“id”)
var user User
context.Bind(&user)
//定义结构体
Id int json:"id"
Name string json:"name"

总结:

如上:如果是form传值,结构体参数后面定义的是form,都可获取参数,也可绑定结构体; //如果是form传值,结构体参数后面定义的是json,都可获取参数,但绑定不了结构体;

如果是json传值,则取不了参数值,但可以绑定结构体;

获取和绑定参数如上

三种绑定方式:

context.Bind() 都可以绑定

context.ShouldBind() 都可以绑定

ShouldBindQuery() 只能绑定get

以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。如有错误或未考虑完全的地方,望不吝赐教。

[!--infotagslink--]

相关文章

  • gin 获取post请求的json body操作

    这篇文章主要介绍了gin 获取post请求的json body操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-15
  • Nest.js参数校验和自定义返回数据格式详解

    这篇文章主要给大家介绍了关于Nest.js参数校验和自定义返回数据格式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-28
  • golang 调用 php7详解及实例

    这篇文章主要介绍了golang 调用 php7详解及实例的相关资料,需要的朋友可以参考下...2017-01-15
  • PHP中empty和isset对于参数结构的判断及empty()和isset()的区别

    废话不多说了,直接给大家贴代码了。<&#63;php class test{} $a1 = null; $a2 = ""; //$a3 = $a4 = 0; $a5 = '0'; $a6 = false; $a7 = array(); //var $a8; $a9 = new test(); for ($i=1; $i <=9 ; $i++) {...2015-11-24
  • 解决Springboot get请求是参数过长的情况

    这篇文章主要介绍了解决Springboot get请求是参数过长的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-17
  • java正则表达式判断前端参数修改表中另一个字段的值

    这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
  • mysql配置模板(my-*.cnf)参数详细说明

    mysql安装成功后有几个默认的配置模板,列表如下: my-huge.cnf : 用于高端产品服务器,包括1到2GB RAM,主要运行mysql my-innodb-heavy-4G.ini : 用于只有innodb的安装,最多有4GB RAM,支持大的查询和低流量 my-large.cnf : 用于...2015-03-15
  • C#中out参数、ref参数与值参数的用法及区别

    这篇文章主要给大家介绍了关于C#中out参数、ref参数与值参数的用法及区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 详解C#泛型的类型参数约束

    这篇文章主要介绍了C#泛型的类型参数约束的相关资料,文中讲解非常细致,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2020-07-31
  • Java线程池中的各个参数如何合理设置

    这篇文章主要介绍了Java线程池中的各个参数如何合理设置操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-19
  • vue+axios全局添加请求头和参数操作

    这篇文章主要介绍了vue+axios全局添加请求头和参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-24
  • SpringBoot接口接收json参数解析

    这篇文章主要介绍了SpringBoot接口接收json参数解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-19
  • pytorch 实现冻结部分参数训练另一部分

    这篇文章主要介绍了pytorch 实现冻结部分参数训练另一部分,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-27
  • 处理@PathVariable注解允许参数为空、允许不传参数的问题

    这篇文章主要介绍了处理@PathVariable注解允许参数为空、允许不传参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-23
  • 详解Java后端优雅验证参数合法性

    这篇文章主要介绍了详解Java后端优雅验证参数合法性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
  • C#向线程中传递多个参数的解决方法(两种)

    这篇文章主要介绍了C#向线程中传递多个参数的解决方法(两种)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 用golang如何替换某个文件中的字符串

    这篇文章主要介绍了用golang实现替换某个文件中的字符串操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-25
  • spring cloud gateway中如何读取请求参数

    这篇文章主要介绍了spring cloud gateway中如何读取请求参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-15
  • 使用JavaScript获取URL中的参数(两种方法)

    这篇文章主要介绍了使用JavaScript获取URL中的参数(两种方法)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-11-22
  • 关于IDEA 2020使用 mybatis-log-plugin插件的问题

    这篇文章主要介绍了关于IDEA 2020使用 mybatis-log-plugin插件的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-10