【笔记】Gin笔记

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即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值