如何在golang中使用gin网络框架

如何在golang中使用gin网络框架?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

golang 原生 http 库已经可以很方便地实现一个 http server 了,但对于复杂的 web 服务来说,路由解析,请求参数解析,对象返回等等,原生 api 就显得有些不太够用了,而 gin 是一个功能完备,性能很高的 web 网络框架,特别适合 web api 的开发

如何在golang中使用gin网络框架

hello world

packagemain

import"github.com/gin-gonic/gin"

funcmain(){
r:=gin.New()
r.GET("/ping",func(c*gin.Context){
c.String(200,"helloworld")
})
r.Run()//listenandserveon0.0.0.0:8080
}

如这个 hello world 程序所示 gin 所有的业务逻辑都在 func(c *gin.Context) 函数中实现,请求和返回都通过这个 gin.Context 传递

请求参数解析

gin 提供了丰富的请求参数获取方式

(c*Context)Query(keystring)string//获取GET参数
(c*Context)QueryArray(keystring)[]string//获取GET参数数组
(c*Context)DefaultQuery(key,defaultValuestring)//获取GET参数,并提供默认值
(c*Context)Param(keystring)string//获取Param参数,类似于"/user/:id"
(c*Context)GetRawData()([]byte,error)//获取body数据

但这些函数我都不建议使用,建议用结构体来描述请求,再使用 bind api 直接将获取请求参数

typeHelloWorldReqstruct{
Tokenstring`json:"token"`
IDint`json:"id"uri:"id"`
Emailstring`json:"email"form:"email"`
Passwordstring`json:"password"form:"password"`
}

req:=&HelloWorldReq{
Token:c.GetHeader("Authorization"),//头部字段无法bind,可以通过GetHeader获取
}

//用请求中的Param参数填充结构体中的uri字段
iferr:=c.BindUri(req);err!=nil{
returnnil,nil,http.StatusBadRequest,fmt.Errorf("bindurifailed.err:[%v]",err)
}

//GET请求中用Query参数填充form字段
//非GET请求,将body中的json或者xml反序列化后填充form字段
iferr:=c.Bind(req);err!=nil{
returnnil,nil,http.StatusBadRequest,fmt.Errorf("bindfailed.err:[%v]",err)
}

http 的客户端 ip 一般在请求头的 X-Forwarded-For 和 X-Real-Ip 中,gin 提供了 (c *Context) ClientIP() string 来获取 ip

返回包体

(c*Context)String(codeint,formatstring,values...interface{})//返回一个字符串
(c*Context)JSON(codeint,objinterface{})//返回一个json
(c*Context)Status(codeint)//返回一个状态码

文件上传和返回

从请求中获取文件

fh,err:=ctx.FormFile("file")
iferr!=nil{
returnerr
}

src,err:=fh.Open()
iferr!=nil{
returnerr
}
defersrc.Close()

返回文件

(c*Context)File(filepathstring)

cros 跨域

服务端返回的头部中有个字段 "Access-Control-Allow-Origin",如果该字段和请求的域不同,浏览器会被浏览器拒绝,其实这个地方我理解应该是客户端没有权限访问,服务端不该返回结果,浏览器认为结果不可用,所以提示跨域错误,而这个头部字段还只能写一个地址,或者写成 *,对所有网站都开放,要想对多个网站开发,我们可以根据请求的 "Origin" 字段,动态地设置 "Access-Control-Allow-Origin" 字段,满足权限得设置成请求中的 "Origin" 字段,gin 的有个插件 github.com/gin-contrib/cors 就是专门用来做这个事情的,可以在 AllowOrigins 中设置多个网站,还可以设置通配符(需设置 AllowWildcard 为 true)

import"github.com/gin-contrib/cors"

r:=gin.New()
r.Use(cors.New(cors.Config{
AllowOrigins:[]string{"a.example.com","b.example.com"},
AllowMethods:[]string{"PUT","POST","GET","OPTIONS"},
AllowHeaders:[]string{"Origin","Content-Type","Content-Length","Accept-Encoding","X-CSRF-Token","Authorization","Accept","Cache-Control","X-Requested-With"},
AllowCredentials:true,
}))

cookies

//maxAge为过期时间
//domain是网站的地址,如需跨域共享cookie,可以设置成域名,
//比如a.example.com和b.example.com,可以将domain设置成example.com
//secure为https设为true,http设为false
//httpOnly设置为false,否则axios之类的库访问不到cookie
(c*Context)SetCookie(name,valuestring,maxAgeint,path,domainstring,secure,httpOnlybool)

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。

发布于 2021-03-24 01:21:40
收藏
分享
海报
0 条评论
153
上一篇:怎么在Java中使用HashMap并查集 下一篇:怎么在Java项目中使用POI导出Excel数据
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码