Go语言Gin框架中使用swagger、cookie、session

文章目录

swagger

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格。文档地址 :https://github.com/swaggo/gin-swagger。使用swagger可以实现:

  • 接口的文档在线自动生成。
  • 功能测试。

Gin框架中使用Swagger:

#1、添加依赖
go get github.com/swaggo/swag/cmd/swag
go get github.com/swaggo/gin-swagger
go get github.com/swaggo/gin-swagger/swaggerFiles

#2、给Handler对应方法添加注解
@Tags:说明该方法的作用@Summary登录
@Description:这个API详细的描述
@Accept:表示该请求的请求类型
@Produce:返回数据类型
@Param:参数,表示需要传递到服务器端的参数
@Success:成功返回给客户端的信息
@Router:路由信息

代码如下:
router.go

package router
import (
	_ "gin-demo/docs"
	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

func Router() *gin.Engine {
	r := gin.Default()
	r1 := r.Group("/home")
	{ 
		r11 := r1.Group("user")
		{
			r11.POST("/register", controllers.Register) //---注册
			r11.GET("/userinfo", controllers.UserInfo)  //---获取用户信息
		}
	}

	//swagger 中间件
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	return r
}

然后在项目根目录执行以下命令:

go install github.com/swaggo/swag/cmd/swag@latest
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files
swag init

接下来会在项目根目录生成一个 docs 目录:
在这里插入图片描述
然后定义两个方法,分别是POSTGET请求,代码如下:
users.go

// @Tags 注册接口
// @Summary 注册
// @Description register
// @Accept json
// @Produce json
// @Param username formData string true "用户名"
// @Param password formData string true "密码"
// @Success 200 {string} json "{"code":200,"msg":"注册成功","data":"OK"}"
// @Router /home/user/register [post]
func Register(c *gin.Context) {
	type User struct {
		UserName string `json:"username"`
		Password string `json:"password"`
	}
	type Response struct {
		Code int    `json:"code"`
		Msg  string `json:"msg"`
		Data string `json:"data"`
	}

	var user User
	//err := c.Bind(&user)
	err := c.BindQuery(&user)
	if err != nil {
		fmt.Println("绑定错误:", err)
		c.JSON(http.StatusBadRequest, "数据错误!")
		return
	}
	c.JSON(http.StatusOK, Response{
		Code: http.StatusOK,
		Msg:  "注册成功",
		Data: "OK",
	})
}

// @Tags 获取用户信息
// @Summary 获取用户的基本信息
// @Description getUserInfo
// @Accept json
// @Produce json
// @Param id query string true "用户ID"
// @Param name query string false "用户名"
// @Success 200 {string} json "{"code":200,"data":{"id":"100","name":"张三"},"msg":"OK"}"
// @Router /home/user/userinfo [get]
func UserInfo(c *gin.Context) {
	id := c.Query("id")
	name := c.Query("name")
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  "OK",
		"data": gin.H{
			"id":   id,
			"name": name,
		},
	})
}

接下来,启动服务,访问 http://localhost:8080/swagger/index.html ,可以看到自动生成了接口文档

以及类似postman的调试工具
在这里插入图片描述

Cookie

//router
r.Use(controllers.CookieAuth()) //cookie中间件
r.GET("/cookie", controllers.Cookie)

//controllers
import (
	"encoding/hex"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

var cookieName string
var cookieValue string

func CookieAuth() gin.HandlerFunc {
	return func(c *gin.Context) {
		val, _ := c.Cookie(cookieName)
		if val == "" {
			c.SetCookie(cookieName, cookieValue, 3600, "/", "localhost", true, true)
			fmt.Println("cookie保存完成")
		}
	}
}
func Cookie(c *gin.Context) {
	name := c.Query("name")
	if len(name) <= 0 {
		c.JSON(http.StatusBadRequest, "name数据错误")
		return
	}
	cookieName = "cookie_" + name                                  //cookie的key值
	cookieValue = hex.EncodeToString([]byte(cookieName + "value")) //cookie的value值
	val, _ := c.Cookie(cookieName)
	if val == "" {
		c.String(http.StatusOK, "Cookie:%s已经下发,下次登录有效", cookieName)
		return
	}
	c.String(http.StatusOK, "验证成功,cookie值为:%s", val)
}

浏览器访问 http://localhost:8080/cookie?name=admin
第一次访问:
在这里插入图片描述
再次访问:
在这里插入图片描述

Session

需要引入 https://github.com/gin-contrib/sessions

//router
r.Use(controllers.SessionAuth()) //session中间件
r.GET("/session", controllers.Session)

//controllers
// 文档地址:https://github.com/gin-contrib/sessions
import (
	"encoding/hex"
	"fmt"
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
	"net/http"
)

var sessionName string  //session的key值
var sessionValue string //session的value值

type MyOption struct {
	sessions.Options
}

func SessionAuth() gin.HandlerFunc {
	store := cookie.NewStore([]byte("session_secret"))
	return sessions.Sessions("mysession", store)
}
func Session(c *gin.Context) {
	name := c.Query("name")
	if len(name) <= 0 {
		c.JSON(http.StatusBadRequest, "name数据错误")
		return
	}
	sessionName = "session_" + name
	sessionValue = "session_value_" + name
	session := sessions.Default(c) //获取的session
	sessionData := session.Get(sessionName)
	if sessionData != sessionValue {
		//保存session
		session.Set(sessionName, sessionValue)
		o := MyOption{}
		o.Path = "/"
		o.MaxAge = 3600 //有效期,单位 s
		session.Options(o.Options)
		session.Save() //保存session
		c.JSON(http.StatusOK, "首次访问,session已经保存")
		return
	}
	c.JSON(http.StatusOK, "访问成功,您的session是:"+sessionData.(string))
}
	

浏览器访问 http://localhost:8080/session?name=admin
第一次访问:
在这里插入图片描述
再次访问:
在这里插入图片描述

源代码:https://gitee.com/rxbook/gin-demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮尘笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值