1. 修改端口号
r := gin.Default()
r.Run(":19001")
2.release模式
gin.SetMode(gin.ReleaseMode)
3.路由分组
r := gin.Default()
group := r.Group("/v1/user/")
group.POST("login", func(c *gin.Context) {
})
group2 := r.Group("/v2/user/")
group2.POST("login", func(c *gin.Context) {
})
4.json解析
r := gin.Default()
group := r.Group("/v1/user/")
group.POST("login", func(c *gin.Context) {
var loginVo LoginVo
if err := c.ShouldBindJSON(&loginVo); err == nil {
c.JSON(http.StatusOK, gin.H{
"name": loginVo.Name,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"msg": err})
}
})
5. 文件上传
group.POST("/upload", func(c *gin.Context) {
//单个文件上传
file, _ := c.FormFile("file")
println(file.Filename)
// 保存文件到磁盘
// c.SaveUploadedFile(file, dst)
c.JSON(http.StatusOK, gin.H{
"fileName": fmt.Sprintf("'%s' uploaded!", file.Filename),
})
})
6. 多个文件上传
group.POST("/upload", func(c *gin.Context) {
// Multipart form
form, _ := c.MultipartForm()
files := form.File["upload[]"]
for _, file := range files {
println(file.Filename)
// 保存文件到磁盘
// c.SaveUploadedFile(file, dst)
}
c.JSON(http.StatusOK, gin.H{
"fileName": fmt.Sprintf("'%s' uploaded!", file.Filename),
})
})
7. Json入参验证
type LoginVo struct {
Name string `json:"name" binding:"required"`
Password string `json:"password" binding:"required"`
}
r := gin.Default()
group := r.Group("/v1/user/")
group.POST("login", func(c *gin.Context) {
var loginVo LoginVo
if err := c.ShouldBindJSON(&loginVo); err == nil {
c.JSON(http.StatusOK, gin.H{
"name": loginVo.Name,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"msg": err})
}
})
8. 设置favicon
group.StaticFile("/favicon.ico", "./favicon.ico")
9. 使用GET, POST, PUT, PATCH, DELETE and OPTIONS
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.POST("/v1/login", func(c *gin.Context) {
})
r.PUT("/v1/user/save", func(c *gin.Context) {
})
r.PATCH("/v1/user/update", func(c *gin.Context) {
})
r.DELETE("/v1/user/delete", func(c *gin.Context) {
})
r.Run(":19001") // listen and serve on 0.0.0.0:8080