如何在golang中使用gin网络框架
如何在golang中使用gin网络框架?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
golang 原生 http 库已经可以很方便地实现一个 http server 了,但对于复杂的 web 服务来说,路由解析,请求参数解析,对象返回等等,原生 api 就显得有些不太够用了,而 gin 是一个功能完备,性能很高的 web 网络框架,特别适合 web api 的开发
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)
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。
推荐阅读
-
Golang中的nil和零值怎么声明
Golang中的nil和零值怎么声明这篇文章主要讲解了“Golan...
-
golang Gob怎么使用
-
golang切片长度与容量指的是什么
golang切片长度与容量指的是什么今天小编给大家分享一下gola...
-
golang循环遍历map的方式有哪些
-
golang如何添加list元素
-
golang包的特性有哪些
golang包的特性有哪些这篇文章主要介绍了golang包的特性有...
-
如何从 PHP 过渡到 Golang?
我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗...
-
golang web从入门到精通 获取请求头信息、GET(POST)请求参数
-
适合PHP转Golang的函数类库
近几年Golang越来越火了,很多之前写PHP的也开始投入到Golang的怀抱中,今天小编给大家推荐一个挺好用的适合php转go的...
-
Golang编程 golang实现php函数json_decode()