Go学习笔记二——windows下使用Gin
Gin 是一个用 Go (Golang) 编写的 web 框架
它具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json
go的版本
配置环境变量
set GO111MODULE=on set GOPROXY=https://goproxy.io
初始化
go mod init demo
获取Gin
go get -u github.com/gin-gonic/gin
1.简单例子
入口文件main.go
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/test", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello", }) }) r.Run() // listen and serve on 0.0.0.0:8080 }
运行
go run main.go
浏览器访问http://localhost:8080/test
返回
{"message":"hello"}
Gin是一个轻量级的 WEB 框架
支持 RestFull 风格 API,支持 GET,POST,PUT,PATCH,DELETE,OPTIONS 等 http 方法,支持文件上传,分组路由,Multipart/Urlencoded FORM,支持 JsonP,参数处理
2.修改启动方式
默认启动方式,包含 Logger、Recovery 中间件
r := gin.Default()
请求接口会输出日志
无中间件启动
r := gin.New()
请求接口不再输出日志
3.日志写入文件
package main import ( "io" "os" "net/http" "github.com/gin-gonic/gin" ) func main() { gin.DisableConsoleColor() // 创建记录日志的文件 f, _ := os.Create("gin.log") gin.DefaultWriter = io.MultiWriter(f) // 如果需要将日志同时写入文件和控制台,请使用以下代码 // gin.DefaultWriter = io.MultiWriter(f, os.Stdout) r := gin.Default() r.GET("/test", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "hello", }) }) r.Run() // listen and serve on 0.0.0.0:8080 }
启动
以前输出的都写入和main.go在同一目录下的gin.log中
4.静态资源
StaticFile 是加载单个文件
StaticFS 是加载一个完整的目录资源
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.StaticFS("/public", http.Dir("E:/go_projects/demo/static")) r.StaticFile("/favicon.ico", "./favicon.ico") r.Run() // listen and serve on 0.0.0.0:8080 }
5.上传文件
单文件
package main import ( "log" "path" "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.StaticFS("/public", http.Dir("E:/go_projects/demo/static")) r.GET("/test", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello", }) }) r.POST("/upload", func(c *gin.Context) { // 单文件 file, _ := c.FormFile("file") log.Println(file.Filename) dst := path.Join("./static/upload", file.Filename) // 上传文件至指定目录 c.SaveUploadedFile(file, dst) c.JSON(200, gin.H{ "message": file.Filename+" uploaded!", }) }) r.Run() // listen and serve on 0.0.0.0:8080 }
测试
多文件
package main import ( "log" "path" "strconv" "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.StaticFS("/public", http.Dir("E:/go_projects/demo/static")) r.GET("/test", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello", }) }) r.POST("/upload", func(c *gin.Context) { // 多文件 form, _ := c.MultipartForm() files := form.File["files[]"] for _, file := range files { log.Println(file.Filename) dst := path.Join("./static/upload", file.Filename) // 上传文件至指定目录 c.SaveUploadedFile(file, dst) } c.JSON(200, gin.H{ "message": strconv.Itoa(len(files))+" uploaded!", }) }) r.Run() // listen and serve on 0.0.0.0:8080 }
测试
6.获取参数
(1)获取路径中的参数
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.StaticFS("/public", http.Dir("E:/go_projects/demo/static")) r.GET("/test/:firstname/:lastname", func(c *gin.Context) { firstname := c.Param("firstname") lastname := c.Param("lastname") c.JSON(http.StatusOK, gin.H{ "message": "hello", "firstname":firstname, "lastname":lastname, }) }) r.Run() // listen and serve on 0.0.0.0:8080 }
测试
(2)获取GET参数
c.Query 解析?后的参数,eg: key1=value2&key2=value2
c.DefaultQuery 处理默认参数
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/test", func(c *gin.Context) { firstname := c.DefaultQuery("firstname", "Guest") lastname := c.Query("lastname") c.JSON(http.StatusOK, gin.H{ "message": "hello", "firstname":firstname, "lastname":lastname, }) }) r.Run() // listen and serve on 0.0.0.0:8080 }
测试
(3)获取post参数
c.PostFROM 解析的是 x-www-form-urlencoded 或 from-data 的参数
c.DefaultPostForm 处理默认参数
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.StaticFS("/public", http.Dir("E:/go_projects/demo/static")) r.POST("/test", func(c *gin.Context) { firstname := c.DefaultPostForm("firstname", "Guest") lastname := c.PostForm("lastname") c.JSON(http.StatusOK, gin.H{ "message": "hello", "firstname":firstname, "lastname":lastname, }) }) r.Run() // listen and serve on 0.0.0.0:8080 }
测试