自己电脑做网站iis,怎么做网络销售的网站,网站底部 图标,wordpress手机双模板下载前些天发现了一个巨牛的人工智能学习网站#xff0c;通俗易懂#xff0c;风趣幽默#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 我们在专栏的前面几篇文章内讲解了Gin框架的路由配置#xff0c;服务启动等内容。 专栏地址… 前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 我们在专栏的前面几篇文章内讲解了Gin框架的路由配置服务启动等内容。 专栏地址https://blog.csdn.net/qq_35716689/category_12575301.html 在我们平常添加路由处理函数之后就可以在路由处理函数中编写业务处理代码了但在此之前我们往往需要获取请求参数本文就详细的讲解下gin获取请求参数常见的几种方式。
目录
前言
传递参数的方式
Header
URL
HTTP Body
直接获取请求参数
获取URL Path中的参数
获取URL Query中的参数
获取HTTP Body中的参数
绑定请求参数
绑定Header参数
绑定URL Path参数
绑定URL Query参数
绑定HTTP Body参数
数据校验
两种方式的对比
小结 传递参数的方式
在一个HTTP请求中一般可以把上传参数分为以下三个部分
Header
Header是HTTP请求中一个键值对集合HTTP规范定义了很多的Headeer比如Content-TypeAccept等不过也可以自定义请求头部或者响应头部。
URL
URL指的是请求路径在请求路径上可以通过两种方式携带请求参数一种是直接写在请求路径上的称为URL Path
http://localhost:8080/user/add
在URL上传递参数的另外一种方式就是URL QueryURL Query参数是指跟在?后面的键值对集合多个参数之间以分隔的
http://localhost:8080/user/add?name小明gender男
HTTP Body
HTTP Body参数是指HTTP请求的请求体所携带的参数这部分参数会因为Content-Type不同而不同比如当Content-Type为application/json时HTTO Body携带的是一串JSON字符串。
那么在Gin框架中要如何获取这些请求参数呢主要有以下两种方式
直接用Gin封装的方法获取请求参数通过绑定的方式来获取请求参数
直接获取请求参数
Gin框架在net/http包的基础上封装了获取参数的方式。
获取URL Path中的参数
在路由中使用通配符时对应的通配符就会成为URL Path参数调用gin.Context的Param()方法可以获取Path参数 package mainfunc main(){engine : gin.Default()engine.GET(/user/:id, func(ctx *gin.Context) {id : ctx.Param(id)fmt.Fprintf(ctx.Writer, 你的请求id:%s, id)})engine.Run()}运行后发起请求 $ curl http://localhost:8080/user/100你的请求id:100
获取URL Query中的参数
gin.Context对象提供了以下几个主要方法用于获取Query参数 package mainimport (fmtgithub.com/gin-gonic/gin)func main() {engine : gin.New()engine.GET(/user/list, func(ctx *gin.Context) {//获取单个值name : ctx.Query(name)//带默认值gender : ctx.DefaultQuery(gender, 男)//数组habits : ctx.QueryArray(habits)//mapworks : ctx.QueryMap(works)fmt.Printf(%s,%s,%s,%s\n, name, gender, habits, works)})engine.Run()}运行后发起请求
curl -X GET http://localhost:8080/user/list?nameJohngender男habits[]readinghabits[]sportsworks[teacher]mathworks[engineer]computer
John,男,[reading sports],map[engineer:computer teacher:math] 获取HTTP Body中的参数
对于通过HTTP Body传上来的参数gin.Context也提供了几种主要方法用于获取 package mainimport (fmtgithub.com/gin-gonic/gin)func main() {engine : gin.New()engine.POST(/user/add, func(ctx *gin.Context) {//获取单个值name : ctx.PostForm(name)//带默认值gender : ctx.DefaultPostForm(gender, 男)//数组habits : ctx.PostFormArray(habits)//mapworks : ctx.PostFormMap(works)fmt.Printf(%s,%s,%s,%s\n, name, gender, habits, works)})engine.Run()}绑定请求参数
Gin支持绑定HeaderURL PathURL Query以及HTTP Body等不同位置数据。
绑定Header参数
绑定Header参数可以使用BindHeader()或者ShouldBindHeader()方法 package mainimport (fmtnet/httpgithub.com/gin-gonic/gin)type testHeader struct {Rate int header:RateDomain string header:Domain}func main() {r : gin.Default()r.GET(/, func(c *gin.Context) {h : testHeader{}if err : c.ShouldBindHeader(h); err ! nil {c.JSON(http.StatusBadRequest, err)return}fmt.Printf(%#v\n, h)c.JSON(http.StatusOK, gin.H{Rate: h.Rate, Domain: h.Domain})})r.Run()}运行后的请求结果
$ curl -H rate:300 -H test:123 http://localhost:8080/
{Test:123,Rate:300}绑定URL Path参数
绑定URL Path参数可以使用BindUri()或者ShouldBindUri()方法
package mainimport (fmtnet/httpgithub.com/gin-gonic/gin
)type User struct {Name string uri:nameEmail string uri:email
}func main() {engine : gin.New()engine.GET(/user/list/:email/:name, func(ctx *gin.Context) {var u Userif err : ctx.BindUri(u);err ! nil {ctx.JSON(http.StatusBadRequest, err)return}fmt.Fprintf(ctx.Writer, 你输入的用户名为%s,邮箱为%s\n, u.Name, u.Email)})engine.Run()
}运行后的请求结果
curl -X GET http://localhost:8080/user/list/john163.com/john
你输入的用户名为john,邮箱为john163.com 绑定URL Query参数
绑定URL Query参数可以使用BindQuery()、ShouldBindQury()、Bind()或者ShouldBind()方法
package mainimport (fmtnet/httpgithub.com/gin-gonic/gin
)type User struct {Name string form:nameEmail string form:email
}func main() {engine : gin.New()engine.GET(/user/list, func(ctx *gin.Context) {var u Userif err : ctx.BindQuery(u);err ! nil {ctx.JSON(http.StatusBadRequest, err)return}fmt.Fprintf(ctx.Writer, 你输入的用户名为%s,邮箱为%s\n, u.Name, u.Email)})engine.Run()
}运行后的请求结果
curl -X GET http://localhost:8080/user/list?emailjohn163.comnamejohn
你输入的用户名为john,邮箱为john163.com 绑定HTTP Body参数
我们知道HTTP Body的参数会根据不同Content-Type传不同格式的数据Gin支持以下几种Content-Type类型的绑定 JSONXMLTOMLYAMLx-www-form-urlencodedmultipart/form-data 注意HTTP Body的数据只在POST请求时才会进行绑定。
绑定HTTP Body参数可以用Bind()和ShouldBind()方法这两个方法会根据当前请求的Content-Type类型自动判断请求的类型。
package mainimport (fmtnet/httpgithub.com/gin-gonic/gin
)type User struct {Name stringEmail string
}func main() {engine : gin.New()engine.POST(/user/add, func(ctx *gin.Context) {var u Userif err : ctx.Bind(u); err ! nil {ctx.JSON(http.StatusBadRequest, err.Error())return}fmt.Fprintf(ctx.Writer, 你输入的用户名为%s,邮箱为%s\n, u.Name, u.Email)})engine.Run()
}如果明确请求数据的类型也可以直接调用对应类型绑定的方法比如确定是JSON格式数据的话可以调用BindJSON()或者ShouldBindJSON()
package mainimport (fmtnet/httpgithub.com/gin-gonic/gin
)type User struct {Name stringEmail string
}func main() {engine : gin.New()engine.POST(/user/add, func(ctx *gin.Context) {var u Userif err : ctx.BindJSON(u); err ! nil {ctx.JSON(http.StatusBadRequest, err.Error())return}fmt.Fprintf(ctx.Writer, 你输入的用户名为%s,邮箱为%s\n, u.Name, u.Email)})engine.Run()
}对于x-www-form-urlencoded和multipart/form-data与Qurey参数一样结构体需要添加form的tag
package mainimport (fmtnet/httpgithub.com/gin-gonic/gin
)type User struct {Name string form:nameEmail string form:email
}func main() {engine : gin.New()engine.POST(/user/add, func(ctx *gin.Context) {var u Userif err : ctx.Bind(u); err ! nil {ctx.JSON(http.StatusBadRequest, err.Error())return}fmt.Fprintf(ctx.Writer, 你输入的用户名为%s,邮箱为%s\n, u.Name, u.Email)})engine.Run()
}数据校验
在数据绑定的时候也可以进行数据校验这里我们为User结构体的标签添加了required属性要求这个字段必须要有
package mainimport (fmtnet/httpgithub.com/gin-gonic/gin
)type User struct {Name string binding:requiredEmail string binding:required
}func main() {engine : gin.New()engine.POST(/user/add, func(ctx *gin.Context) {var u Userif err : ctx.Bind(u); err ! nil {ctx.JSON(http.StatusBadRequest, err.Error())return}fmt.Fprintf(ctx.Writer, 你输入的用户名为%s,邮箱为%s\n, u.Name, u.Email)})engine.Run()
}两种方式的对比
相较于直接获取请求参数请求数据绑定是一种更强大且优雅的参数获取方式使用这种方式获取参数有以下几个好处
直接将所有参数绑定到一个结构体中不需要手动一个个地获取参数。绑定后的参数会自动转换为结构体对应字段的类型不需要手动对每个参数进行数据类型转换。在进行数据绑定的同时还可以进行数据校验。
小结
直接获取请求参数虽然没有绑定参数那么强大但对于简单的请求来说也是够用的因此我们可以根据自己的需求选择对应的方式来获取请求参数。