1

【笔记】Gin学习笔记

 1 year ago
source link: https://loli.fj.cn/2023/03/27/Gin%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API,性能要好得多,多亏了 httprouter,速度提高了 40 倍。 如果您需要性能和良好的生产力,您一定会喜欢 Gin。(官方

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

获取Engine对象

engine = gin.New()
  • 通过gin.Default()创建的实例会自带Logger中间件和Recovery中间件

Recovery中间件的作用是:如果程序执行过程中遇到panic中断了服务,则Recovery会恢复程序执行,并返回服务器500内部错 误。

engine = gin.Default()

处理HTTP请求

通用的请求处理

处理GET请求

default:如果没有请求,为变量赋值默认值

// 创建引擎对象
engine := gin.Default()
// 创建控制器
engine.Handle("GET", "/", func(context *gin.Context) {
// 获取GET请求参数
value := context.DefaultQuery("key", "default")
// 返回响应数据
context.Writer.Write([]byte(value))
})
// 开启服务器
engine.Run()

处理POST请求

// 创建引擎对象
engine := gin.Default()
// 创建控制器
engine.Handle("POST", "/", func(context *gin.Context) {
// 获取POST请求参数
value := context.PostForm("key")
// 返回响应数据
context.Writer.Write([]byte(value))
})
// 开启服务器
engine.Run()

处理RESTful的DELETE请求

// 创建引擎对象
engine := gin.Default()
// 创建控制器
engine.Handle("DELETE", "/:key", func(context *gin.Context) {
// 获取POST请求参数
value := context.Param("key")
// 返回响应数据
context.Writer.Write([]byte(value))
})
// 开启服务器
engine.Run()

获取请求行中的数据

获取请求方式

context.Request.Method

获取请求资源路径

path := context.FullPath();

获取请求头中的数据

获取指定请求头的数据

<key>:请求头的键

context.Request.Header.Get("<key>")

获取请求携带的参数

获取GET请求的请求参数

value := context.Query("key")
指定参数的默认值

default:如果没有请求,为变量赋值默认值

value := context.DefaultQuery("key", "default")

获取POST请求的请求参数

value := context.PostForm("key")
参数是否存在

exist:如果存在指定参数,则返回true;如果不存在指定参数,则返回false

value, exist := context.GetPostForm("key")

获取RESTful的请求参数

  • 在传递参数时,通过:标记占位符

http://example.com/:key

value := context.Param("key")

表单实体绑定

GET提交的请求参数

usernamepassword:结构体的属性
form="username"form="password":请求参数的key
binding:"required":必须传递的

type User strut {
Username string `form:"username" binding:"required"`
Password string `form:"password" binding:"required"`
}
var user User
err := context.ShouldBindQuery(&user)
if err != nil {
log.Fatal(err.Error())
}

POST提交的请求参数

Form表单

usernamepassword:结构体的属性
form="username"form="password":请求参数的key
binding:"required":必须传递的

type User strut {
Username string `form:"username" binding:"required"`
Password string `form:"password" binding:"required"`
}
var user User
err := context.ShouldBind(&user)
if err != nil {
log.Fatal(err.Error())
}
var user User
if err := context.shouldBind(&user) != nil {
log.Fatal(err.Error())
}

JSON格式字符串

usernamepassword:结构体的属性
form="username"form="password":请求参数的key
binding:"required":必须传递的

type User strut {
Username string `form:"username" binding:"required"`
Password string `form:"password" binding:"required"`
}
var user User
err := context.ShouldBind(&user)
if err != nil {
...
}

获取响应行的数据

获取响应状态码

context.Writer.Status()

设置响应头的数据

设置指定请求头的数据

<key>:响应头键
<key>:响应头值

context.Writer.Header().Set("<key>", "<value>")
context.Header("<key>", "<value>")
context.Set("<key>", "<value>")

设置响应数据

返回字节数组

context.Writer.Writer([]byte(""))

返回字符串

context.Writer.WriterString("")

返回JSON格式字符串

Map转换为JSON

http.StatusOK:200

context.JSON(http.StatusOK, map[string]interface{}{
"code": 1,
"msg": "ok",
"data": 数据,
})
结构体转换为JSON

http.StatusOK:200

type Response strut {
Code int
Msg string
Date interface{}
}
resp := Response{
code: 1,
message: "ok",
data: 数据
}
context.JSON(http.StatusOK, &resp)

返回HTML页面

通过引擎加载HTML文件
engine.LoadHTMLGlob("./*.html")
通过引擎加载静态资源文件
  • 将静态资源访问路径和与静态资源文件实际存储路径映射

/img:请求路径
./img:实际静态资源文件存储路径

engine.Static("/img", "./img")
不传递参数
返回HTML页面

http.StatusOK:200

context.HTML(http.StatusOK, "./index.html")
创建HTML页面

index.html

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>

</body>
</html>
  • 通过模版语言传递参数
返回HTML页面并传递参数

http.StatusOK:200

context.HTML(http.StatusOK, "./index.html", gin.H{
"key": "value"
})
创建HTML页面
  • 通过{{.}}语法渲染数据

index.html

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>

{{.key}}

</body>
</html>
// 创建引擎对象
engine := gin.Default()
// 创建路由组
routerGroup := engine.Group("/user")
routerGroup.POST("/login", func(context *gin.Context) {
context.Writer.WriteString("")
})
routerGroup.POST("/register", func(context *gin.Context) {
context.Writer.WriteString("")
})
// 开启服务器
engine.Run()
func main() {
// 创建引擎对象
engine := gin.Default()
// 创建路由组
routerGroup := engine.Group("/user")
routerGroup.POST("/register", register)
routerGroup.POST("/login", login)
// 开启服务器
engine.Run()

}

func login(context *gin.Context) {
context.Writer.WriteString("")
}
func register(context *gin.Context) {
context.Writer.WriteString("")
}

举例:定义一个中间件,用于打印请求方式与请求路径

定义中间件函数

  • 中间件函数返回HandleFunc类型

context.Next():遇到Next函数立即停止执行当前中间件,继续向下处理请求后,再继续执行Next函数后面的代码

func printInfo() gin.HandlerFunc {
return func(context *gin.Context) {
fmt.Println("请求Method: " + context.Request.Method + " 请求Path: " + context.FullPath())

context.Next()

fmt.Println("响应状态码: " + context.Writer.Status())
}
}

挂载中间件

为全局挂载中间件

printInfo():中间件函数

engine.Use(printInfo())

为指定处理器挂载中间件

printInfo():中间件函数

engine.Handle("GET", "/", printInfo(), func(context *gin.Context) {
...
})

哔哩哔哩——80技术


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK