Gin学习

Gin学习

一、导入包进行初始服务

package main

import "github.com/gin-gonic/gin" //引入gin包

func main() {
	r := gin.Default()
	r.GET("/pings", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
r.Run(":1010") // listen and serve on 0.0.0.0:8080,端口号可以修改
}

二、发送请求

1、修改端口号

r.Run(":1010") // listen and serve on 0.0.0.0:8080,端口号可以修改

2、get请求获取参数

(1)各种请求获取

    router.GET("/someGet", getting)
	router.POST("/somePost", posting)
	router.PUT("/somePut", putting)
	router.DELETE("/someDelete", deleting)
	router.PATCH("/somePatch", patching)
	router.HEAD("/someHead", head)
	router.OPTIONS("/someOptions", options)

(2)获取参数

获取路径中的参数

r := gin.Default()
	r.GET("/index/:name", func(c *gin.Context) {
		name := c.Param("name")
		c.JSON(200, gin.H{
			name: name,
		})
	})
	r.Run() //默认8080s

通配符匹配网页,index/后面的全为action字符串,如果没有其他路由器匹配/user/john,它将重定向到/user/john/

	r := gin.Default()
	r.GET("/index/:name/*action", func(c *gin.Context) {
		name := c.Param("name")
		action := c.Param("action")
		message := name + " is " + action
		c.JSON(200, gin.H{
			message: message,
		})
	})
	r.Run() //默认8080s

获取get中的参数

r := gin.Default()
	r.GET("/index", func(c *gin.Context) {
		id := c.Query("id") //直接查询get方法中的id
		name := c.DefaultQuery("name", "这是默认值")
		c.JSON(200, gin.H{
			id:   id,
			name: name,
		})
	})
	r.Run() //默认8080s

3、post请求获取参数

r := gin.Default()
	r.POST("/index", func(c *gin.Context) {
		name := c.PostForm("name") //获取post的值
		id := c.DefaultPostForm("id", "这是默认id")
		c.JSON(200, gin.H{
			id:   id,
			name: name,
		})
	})
	r.Run() //默认8080s

4、Put请求参数

Put方法和Post方法的接收参数相同

r := gin.Default()
	r.PUT("/index", func(c *gin.Context) {
		name := c.PostForm("name") //获取post的值
		id := c.DefaultPostForm("id", "这是默认id")
		c.JSON(200, gin.H{
			id:   id,
			name: name,
		})
	})
	r.Run() //默认8080s

5、delete请求参数(和get方法相同)

r := gin.Default()
	r.DELETE("/index/:name", func(c *gin.Context) {
		name := c.Param("name") //获取post的值
		c.JSON(200, gin.H{
			"name": name,
		})
	})
	r.Run() //默认8080s

三、模型绑定

一般传参数的时候可以直接映射到结构体当中,所以就需要进行模型绑定

1、ShouldBind(绑定从表单来的数据)

	r := gin.Default()
	r.POST("/index", func(c *gin.Context) {
		var user User
		err := c.ShouldBind(&user) //绑定路由
		if err != nil {
			log.Fatal("绑定出错", err)
			return
		}
		//绑定结束,进行数据验证
		if user.Id != 1 || user.Name != "yang" {
			c.String(404, "传输的值不匹配")
			return
		}
		c.JSON(200, gin.H{
			"id":   user.Id,
			"name": user.Name,
		})
	})
	r.Run()

2、ShouldBind+Type

举例:ShouldBindJSON,只能接收Json类型的数值进行解析,需要加上tag标签

	r := gin.Default()
	r.POST("/index", func(c *gin.Context) {
		var user User
		err := c.ShouldBindJSON(&user) //将user绑定在路由上
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Println("id为", user.Id)
		fmt.Println("名字为", user.Name)
		//绑定结束,进行数据验证
		if user.Id != 1 || user.Name != "yang" {
			c.String(404, "传输的值不匹配")
			return
		}
		c.JSON(200, gin.H{
			"id":   user.Id,
			"name": user.Name,
		})
	})
	r.Run()

2、binding自定义验证器

(1)定义binding标签

type Student struct {
	Id   int    `json:"id" binding:"required,MyTest"`
	Name string `json:"name"`
}

(2)自定义规则函数

传参数通过反射获取值然后进行判断

func MyTest(fl validator.FieldLevel) bool {
	if fl.Field().Interface().(int) == 1 {
		return false
	}
	return true
}

(3)注册验证规则

	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		_ = v.RegisterValidation("MyTest", MyTest)
	}

注意:一定要对结构体进行绑定之后才可以使用自定义验证器

r := gin.Default()
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		_ = v.RegisterValidation("MyTest", MyTest)
	}
	r.POST("/index", func(c *gin.Context) {
		var stu Student
		err := c.BindJSON(&stu)
		if err != nil {
			c.JSON(200, gin.H{
				"res": "出错了",
			})
		} else {
			c.JSON(200, gin.H{
				"res": "成功了",
			})
		}

	})
	r.Run()

三、文件的接收和返回

1、文件的上传

func main() {
	router := gin.Default()
	// 给表单限制上传大小 (默认 32 MiB)
	// router.MaxMultipartMemory = 8 << 20  // 8 MiB
	router.POST("/upload", func(c *gin.Context) {
		// 单文件
		file, _ := c.FormFile("file")
		log.Println(file.Filename)

		// 上传文件到指定的路径
		// c.SaveUploadedFile(file, dst)

		c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
	})
	router.Run(":8080")
}

测试:

curl -X POST http://localhost:8080/upload \
  -F "file=@/Users/appleboy/test.zip" \
  -H "Content-Type: multipart/form-data"

2、多文件上传

func main() {
	router := gin.Default()
	// 给表单限制上传大小 (默认 32 MiB)
	// router.MaxMultipartMemory = 8 << 20  // 8 MiB
	router.POST("/upload", func(c *gin.Context) {
		// 多文件
		form, _ := c.MultipartForm()
		files := form.File["upload[]"]

		for _, file := range files {
			log.Println(file.Filename)

			// 上传文件到指定的路径
			// c.SaveUploadedFile(file, dst)
		}
		c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
	})
	router.Run(":8080")
}

测试:

curl -X POST http://localhost:8080/upload \
  -F "upload[]=@/Users/appleboy/test1.zip" \
  -F "upload[]=@/Users/appleboy/test2.zip" \
  -H "Content-Type: multipart/form-data"

四、gin的中间件和路由分组

1、路由分组

//路由分组
	r := gin.Default()
	v1 := r.Group("/v1") //创建v1组
	{
		v1.GET("/login0", func(c *gin.Context) {
			c.JSON(200, gin.H{
				"res": "login0页面成功",
			})
		})
		v1.GET("/login1", func(c *gin.Context) {
			c.JSON(200, gin.H{
				"res": "login1页面成功",
			})
		})
		v1.GET("/login2", func(c *gin.Context) {
			c.JSON(200, gin.H{
				"res": "login2页面成功",
			})
		})
	}
	r.Run()

2、中间件

定义:在到达路由的前和后都要执行的方法叫做中间件(多个中间件类似洋葱);
在这里插入图片描述
USE方法调用中间件,next前面的先执行,后面的最后执行,完成后顺序交换继续执行。

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

func middle() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("我在方法前,我是1")
		c.Next()
		fmt.Println("我在方法后,我是2")
	}
}
func middle2() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("我在方法前,我是1")
		c.Next()
		fmt.Println("我在方法后,我是2")
	}
}
func main() {
	r := gin.Default()
	v1 := r.Group("v1").Use(middle(), middle2()) //加载中间件
	v1.GET("/index", func(c *gin.Context) {
		fmt.Println("我在方法内部")
		c.JSON(200, gin.H{
			"res": true,
		})
	})
	r.Run()
}

五、gin的日志

不推荐使用gin的日志工具,推荐使用
在这里插入图片描述

七、jwt的使用

作用:前端身份认证工具

具体new和解析

工作中的使用:

签发和解析token

如果看完对自己有所帮助,请点赞支持,谢谢大家

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值