微信推广网站建设,媒介平台,网站建设程序策划书,施工企业法定条件环境#xff1a;
MAC M1#xff0c;Go 1.17.2#xff0c;GoLand 默认执行指令的终端#xff0c;如果没有特别说明#xff0c;指的都是goland-Terminal
创建项目
Goland中新建项目#xff0c;在$GOPATH/src/目录下建立t_gin项目。 进入项目#xff0c;在goland的T…环境
MAC M1Go 1.17.2GoLand 默认执行指令的终端如果没有特别说明指的都是goland-Terminal
创建项目
Goland中新建项目在$GOPATH/src/目录下建立t_gin项目。 进入项目在goland的Terminal终端下默认pwd是项目所在目录执行指令下载gin
go get -u github.com/gin-gonic/gin很快就会安装好。 然后在t_gin下建立一个新的go文件main.go用来作为项目的入口文件。
GET与POST请求参数处理
在main.go中开始编写代码框架的话就先从接收参数开始。
package t_ginimport (github.com/gin-gonic/ginnet/http
)func main() {r : gin.Default()//Get 参数r.GET(/getTest, func(c *gin.Context) {name : c.Query(name)c.JSON(http.StatusOK, gin.H{code: 0,data: name,})})//Post 参数r.POST(/postTest, func(c *gin.Context) {name : c.PostForm(name)bankNoArr : c.PostFormArray(bankNo)var ret []stringfor _, bankNo : range bankNoArr {ret append(ret, bankNo)}result : make(map[string]interface{})result[name] nameresult[bankNos] retc.JSON(http.StatusOK, gin.H{code: 0,data: result,})})r.Run()
}
好的执行一下看看
$ go run main.go
package command-line-arguments is not a main package
没有运行成功报了错误这个错误提示比较浅显是package的问题执行应该是main包我们调整一下代码如下部分
package main然后再运行看看
$ go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in debug mode. Switch to release mode in production.- using env: export GIN_MODErelease- using code: gin.SetMode(gin.ReleaseMode)[GIN-debug] GET /getTest -- main.main.func1 (3 handlers)
[GIN-debug] POST /postTest -- main.main.func2 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080好的现在运行成功了由于没有指定端口在r.run()中可以指定端口所以默认使用8080端口启动。 在测试代码里我写了get和post两种请求方式的参数获取这也是日常最常见的请求方式。 我们用postman对这两个接口做一下测试看看参数获取是否正确。 先测试Get get请求的参数能够正确获取。 那我们再测试一下post 很好post请求参数也能够正常接收。
上传文件
在开发过程中经常遇到的请求类型除了Get和Post的接口请求可能就是上传文件的请求了当然上传文件也属于Post请求的一种。 下面我们再来测试一下上传文件的基本实现首先为了存放上传的文件我们在t_gin目录下建立一个新的文件夹upload专门用来存放上传的文件。 测试上传文件的代码如下 r.POST(/upload, func(c *gin.Context) {f, err : c.FormFile(uploadFile)if err ! nil {panic(err.Error())}err c.SaveUploadedFile(f, ./upload/f.Filename)if err ! nil {panic(err.Error())}c.JSON(http.StatusOK, gin.H{code: 0,data: f.Filename,})})还是用postman进行测试 测试是成功的那我们看看t_gin/upload/目录下是不是已经有了上传的文件呢 已经有了对不对符合我们的预期。
上传多个文件
上传文件的操作有些时候可能会一次上传多个文件那这种情况怎么处理呢我们也来尝试一下这种场景。 测试多个文件上传的代码如下
r.POST(/multiUpload, func(c *gin.Context) {multiForm, _ : c.MultipartForm()files : multiForm.File[uploadFile]var result []stringfor _, file : range files {result append(result, file.Filename)err : c.SaveUploadedFile(file, ./upload/file.Filename)if err ! nil {log.Println(file save error: file.Filename)continue}}c.JSON(http.StatusOK, gin.H{code: 0,data: result,})})同样的我们还是将上传的文件放到./t_gin/upload/目录下用postman测试一下看看 好的接口提示是上传成功了我们再看一下upload目录下是不是已经有了上传的文件 确实是有了那多个文件上传的基本操作也成功了。
文件下载
既然说了文件上传那就可能有文件下载我们也来尝试一下文件下载的实现。 测试代码如下
r.GET(/downloadFile, func(c *gin.Context) {//c.File(./upload/cat1.HEIC)c.FileAttachment(./upload/cat1.HEIC, mycat.HEIC)})浏览器试了一下ok。
JSON参数处理
想想还有什么呢。。。。 对了日常的请求中使用最多的应该是json格式的参数再尝试一下json格式的参数处理 测试代码如下
r.POST(/jsonTest, func(c *gin.Context) {type jsonParam struct {Name string json:nameAge int json:ageSex string json:sex}var jsonP jsonParamerr : c.BindJSON(jsonP)if err ! nil {log.Panic(err.Error())}c.JSON(http.StatusOK, gin.H{code: 0,data: jsonP,})})看代码可以发现当参数是json形式时是将json参数bind到了一个struct上。 有没有什么似曾相识的感觉 对就是java和java的参数接收十分相像 ok我们也用Postman测试一下看看 好的没什么问题。
路由分组
还有个不是参数相关的属于路由范畴算是路由分组实际开发中总会遇到不同的模块而模块内的接口前半部分大多情况下是相同的这就属于路由分组了。 我们看下gin中怎么实现的分组通常会有多个路由在一起所以处理方法我们也集中起来放这里我们在t_gin/目录下再建立一个controller文件夹用来存放处理方法。 建好controller文件夹后在其中新建learn.go代码文件代码如下
package controllerimport (github.com/gin-gonic/ginnet/http
)type LearnController struct {
}func (l *LearnController) First(c *gin.Context) {c.JSON(http.StatusOK, gin.H{code:0,data:this is first handle,})
}func (l *LearnController) Second(c *gin.Context) {c.JSON(http.StatusOK, gin.H{code:0,data:this is second handle,})
}由于是做测试用这里我在方法内部直接做了返回。 好的现在处理方法有了我们来处理路由分组这部分是在main.go当中 rg : r.Group(/learn){learnCtrl : controller.LearnController{}rg.GET(/first, learnCtrl.First)rg.GET(/second, learnCtrl.Second)}同样我们也测试一下看看是否符合我们的预期 ok没什么问题。
常用的基本就这些还有其它的一些偶尔也会用到有需要再去翻文档吧。 今天就到这里。