golang 网络框架之gin的使用方法
golang原生http库已经可以很方便地实现一个httpserver了,但对于复杂的web服务来说,路由解析,请求参数解析,对象返回等等,原生api就显得有些不太够用了,而gin是一个功能完备,性能很高的web网络框架,特别适合webapi的开发
helloworld
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 }
如这个helloworld程序所示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数据
但这些函数我都不建议使用,建议用结构体来描述请求,再使用bindapi直接将获取请求参数
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)
另外,axios需要设置withCredentials:truecookie才能正常返回
链接
github地址:https://github.com/gin-gonic/gin
代码示例:https://github.com/hpifu/tpl-go-http
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。