获取请求头和设置响应头
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func aa(context *gin.Context) {
//获取请求头参数 不区分大小写
str := context.GetHeader("qingqiutou")
fmt.Println("获取请求头参数:", str)
//设置响应头
context.Header("token", "6666666666abc")
context.JSON(200, gin.H{"msg": "成功"})
}
func main() {
//创建路由
router := gin.Default()
//postman访问aa路径
router.POST("/aa", aa)
//启动端口号
router.Run(":8080")
}
绑定json格式的参数
package main
import (
"github.com/gin-gonic/gin"
)
type User struct {
//加标签 就是返回的时候 返回小写
Age int `json:"age"`
Name string `json:"name"`
}
func aa(context *gin.Context) {
var user User
//绑定json格式 传参必须要加&
err := context.ShouldBindJSON(&user)
if err != nil {
context.JSON(200, gin.H{"msg": "出错了"})
return
}
context.JSON(200, user)
}
func main() {
//创建路由
router := gin.Default()
//postman访问aa路径
router.POST("/aa", aa)
//启动端口号
router.Run(":8080")
}
绑定query参数
package main
import (
"github.com/gin-gonic/gin"
)
type User struct {
//加标签 就是返回的时候 返回小写
//使用ShouldBindQuery的时候 必须加form
Age int `json:"age" form:"age"`
Name string `json:"name" form:"name"`
}
func aa(context *gin.Context) {
var user User
//绑定json格式 传参必须要加&
err := context.ShouldBindQuery(&user)
if err != nil {
context.JSON(200, gin.H{"msg": "出错了"})
return
}
context.JSON(200, user)
}
func main() {
//创建路由
router := gin.Default()
//postman访问aa路径
router.POST("/aa", aa)
//启动端口号
router.Run(":8080")
}
binding字段校验
package main
import (
"github.com/gin-gonic/gin"
)
type User struct {
//必填
Age int `json:"age" binding:"required"`
//长度必须是4
Name string `json:"name" binding:"len=4"`
}
func aa(context *gin.Context) {
var user User
//绑定json格式 传参必须要加&
err := context.ShouldBindJSON(&user)
if err != nil {
context.JSON(200, gin.H{"msg": err.Error()})
return
}
context.JSON(200, user)
}
func main() {
//创建路由
router := gin.Default()
//postman访问aa路径
router.POST("/aa", aa)
//启动端口号
router.Run(":8080")
}
如果age没有输入数据,就提示下面的错误信息
上传单个文件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"io"
)
func aa(context *gin.Context) {
//接收文件的参数
file, _ := context.FormFile("file")
fmt.Println("文件字节数:", file.Size)
fmt.Println("文件名称", file.Filename)
//打开文件
reader, _ := file.Open()
//读取文件的内容
data, _ := io.ReadAll(reader)
fmt.Println("-----------------------------")
fmt.Println(string(data))
fmt.Println("-----------------------------")
//保存到e盘的一个目录
context.SaveUploadedFile(file, "E:\\go\\"+file.Filename)
context.JSON(200, gin.H{"msg": "成功"})
}
func main() {
//创建路由
router := gin.Default()
//postman访问aa路径
router.POST("/aa", aa)
//启动端口号
router.Run(":8080")
}
上传多个文件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func aa(context *gin.Context) {
//接收文件的参数
form, _ := context.MultipartForm()
files, _ := form.File["files"]
for _, file := range files {
fmt.Println("文件名称", file.Filename)
//保存到e盘
context.SaveUploadedFile(file, "e://go//"+file.Filename)
}
context.JSON(http.StatusOK, gin.H{"msg": "成功"})
}
func main() {
//创建路由
router := gin.Default()
//postman访问aa路径
router.POST("/aa", aa)
//启动端口号
router.Run(":8080")
}
下载文件
package main
import (
"github.com/gin-gonic/gin"
)
func aa(context *gin.Context) {
//设置为下载的格式 这样浏览器才能有下载的样子
context.Header("Content-Type", "application/octet-stream")
//设置下载的文件名称 要不然 不会下载成 xxx.txt,而是一个没有后缀的文件
context.Header("Content-Disposition", "attachment; filename=新建 文本文档.txt")
//要下载的那个文件地址
context.File("E:\\go\\新建 文本文档.txt")
}
func main() {
//创建路由
router := gin.Default()
router.GET("/aa", aa)
//启动端口号
router.Run(":8080")
}
浏览器访问路径之后,直接在下载的地方就能看到,下载的文件
中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func aa(context *gin.Context) {
fmt.Println("aa")
context.JSON(200, gin.H{"msg": "aa"})
}
func bb(context *gin.Context) {
fmt.Println("bb")
context.JSON(200, gin.H{"msg": "bb"})
}
func main() {
//创建路由
router := gin.Default()
router.POST("/test", aa, bb)
//启动端口号
router.Run(":8080")
}
中间件就是一个路径里面,可以有多个方法
context.Abort()
当在aa方法里面设置了这一行代码,那么bb方法就不会执行了
context.Next()
当在aa方法设置了这一行代码,那么就是先让bb方法先执行,然后再回来执行aa剩余的代码
全局路由和参数传递
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func aa(context *gin.Context) {
//接收上一个 方法/函数 传过来的参数
name, _ := context.Get("name")
fmt.Println("aa:", name)
context.JSON(200, gin.H{"msg": "aa"})
}
func bb(context *gin.Context) {
//接收上一个 方法/函数 传过来的参数
name, _ := context.Get("name")
fmt.Println("bb:", name)
context.JSON(200, gin.H{"msg": "bb"})
}
func qj(context *gin.Context) {
fmt.Println("我是全局中间件,当执行任何路径,都会触发我这个方法")
//给下一个 方法/函数 设置 参数
context.Set("name", "张三")
}
func main() {
//创建路由
router := gin.Default()
//注册全局中间件
router.Use(qj)
router.POST("/aa", aa)
router.POST("/bb", bb)
//启动端口号
router.Run(":8080")
}