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
目录:
然后定义两个方法,分别是POST
和GET
请求,代码如下:
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