bind绑定参数
ShouldBindJSON
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
//声明结构体
type PostParams struct {
Name string `json:"name" `
Age int `json:"age" `
Sex bool `json:"sex" `
}
func main() {
r := gin.Default()
r.POST("/testBind", func(c *gin.Context) {
//实例化
var p PostParams
err := c.ShouldBindJSON(&p)
if err != nil {
fmt.Println(err.Error())
c.JSON(200, gin.H{
"msg": "报错了",
"data": gin.H{},
})
} else {
c.JSON(200, gin.H{
"msg": "成功了",
"data": p,
})
}
})
r.Run(":8050") //启动一个web服务,默认在0.0.0.0:8080启动服务
}
binding:"required
type PostParams struct {
Name string `json:"name" binding:"required`
Age int `json:"age" binding:"required"`
Sex bool `json:"sex" binding:"required`
}
如果传入空字符则报错
binding:"required,mustBig":自定义表单验证器
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/validator/v10"
)
type PostParams struct {
//声明结构体
Name string `json:"name" `
Age int `json:"age" binding:"required,mustBig"`
Sex bool `json:"sex" `
}
func mustBig(fl validator.FieldLevel) bool {
if fl.Field().Interface().(int) <= 18 {
return false
}
return true
}
func main() {
r := gin.Default()
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("mustBig", mustBig)
}
...........
}
ShouldBindUri
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
//声明结构体
type PostParams struct {
Name string `json:"name" uri:"name"`
Age int `json:"age" uri:"age"`
Sex bool `json:"sex" uri:"sex"`
}
func main() {
r := gin.Default()
r.POST("/testBind/:name/:age/:sex", func(c *gin.Context) {
//实例化
var p PostParams
err := c.ShouldBindUri(&p)
if err != nil {
fmt.Println(err.Error())
c.JSON(200, gin.H{
"msg": "报错了",
"data": gin.H{},
})
} else {
c.JSON(200, gin.H{
"msg": "成功了",
"data": p,
})
}
})
r.Run(":8050") //启动一个web服务,默认在0.0.0.0:8080启动服务
}
gin对于文件的上传和返回
先在postman设置 如下图
Content-Type multipart/form-data
单文件上传和返回
上传
方法一: SaveUploadedFile 该方法其实就是gin对方法二的一种封装
func main() {
r := gin.Default()
r.POST("/testUpload", func(c *gin.Context) {
file, _ := c.FormFile("file")
c.SaveUploadedFile(file, "./"+file.Filename)
c.JSON(200, gin.H{
"msg": file,
})
})
r.Run(":8050")
}
方法二:os.create方法来写
func main() {
r := gin.Default()
r.POST("/testUpload", func(c *gin.Context) {
file, _ := c.FormFile("file")
//若附加属性 例如name
//name := c.PostForm("name")
in, _ := file.Open()
defer in.Close()
out, _ := os.Create("./" + file.Filename)
defer out.Close()
io.Copy(out, in)
c.JSON(200, gin.H{
"msg": file,
//"name": name,
})
})
r.Run(":8050")
}
返回
给前端返回文件
func main() {
r := gin.Default()
r.POST("/testUpload", func(c *gin.Context) {
file, _ := c.FormFile("file")
in, _ := file.Open()
defer in.Close()
out, _ := os.Create("./" + file.Filename)
defer out.Close()
io.Copy(out, in)
c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", file.Filename))
c.File("./" + file.Filename)
})
r.Run(":8050")
}
多文件上传和返回
上传
func main() {
r := gin.Default()
r.POST("/testUpload", func(c *gin.Context) {
form, _ := c.MultipartForm()
file := form.File["file"]
fmt.Println(file)
for _, f := range file {
log.Println(f.Filename)
}
})
r.Run(":8050")
}
方法一:SaveUploadedFile
func main() {
r := gin.Default()
r.POST("/testUpload", func(c *gin.Context) {
form, _ := c.MultipartForm()
file := form.File["file"]
fmt.Println(file)
for _, f := range file {
c.SaveUploadedFile(f, "./"+f.Filename)
}
c.JSON(200, gin.H{
"msg": file,
})
})
r.Run(":8050")
}
方法二:os.create
func main() {
r := gin.Default()
r.POST("/testUpload", func(c *gin.Context) {
form, _ := c.MultipartForm()
file := form.File["file"]
fmt.Println(file)
for _, f := range file {
//log.Println(f.Filename)
in, _ := f.Open()
defer in.Close()
out, _ := os.Create("./" + f.Filename)
defer out.Close()
io.Copy(out, in)
}
c.JSON(200, gin.H{
"msg": file,
})
})
r.Run(":8050")
}
返回
给前端返回文件
func main() {
r := gin.Default()
r.POST("/testUpload", func(c *gin.Context) {
form, _ := c.MultipartForm()
file := form.File["file"]
fmt.Println(file)
for _, f := range file {
c.SaveUploadedFile(f, "./"+f.Filename)
c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", f.Filename))
c.File("./" + f.Filename)
}
c.JSON(200, gin.H{
"msg": file,
})
})
r.Run(":8050")
}
写程序中遇到的难题
1、当我将方法封装起来再用main方法调用时
报错xxxxxx : cannot find package
实际上是main方法中的import 导包不正确。
由于本人使用 IDEA 下的goland进行开发编程的。所以到工程中删除 .idea文件夹重启goland即可