gin的github.com地址https://github.com/gin-gonic/gin
首先下载依赖
go get -u -v github.com/gin-gonic/gin
使用场景
<1>GET请求,无参数
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default() // 初始化
r.GET("/ping",func(c *gin.Context) {
// 返回JSON数据
c.JSON(http.StatusOK,gin.H{
"code":200,
"message":"pong", // 某尾有逗号
})
// 返回字符串
// c.String(http.StatusOK,"pong")
})
// 启动并监听8046端口
r.Run(":8046")
}
验证:
<2>GET请求,多级路径
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default() // 初始化
r.GET("/hello/:name",func(c *gin.Context) {
// 获取变量值
name := c.Param("name")
// 返回字符串
c.String(http.StatusOK,"hello %s",name)
})
// 启动并监听8046端口
r.Run(":8046")
}
验证:
<3>GET请求,带参数
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default() // 初始化
r.GET("/query",func(c *gin.Context) {
// 获取变量值,设置默认值为hello
firstname := c.DefaultQuery("firstname","hello")
lastname := c.Query("lastname")
// 返回字符串
c.String(http.StatusOK,"%s %s",firstname,lastname)
})
// 启动并监听8046端口
r.Run(":8046")
}
验证:
<4>POST请求,表单形式
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default() // 初始化
r.POST("/data",func(c *gin.Context) {
// 获取变量值,设置默认值为200
code := c.DefaultPostForm("code","200")
message := c.PostForm("message")
// 返回json数据
c.JSON(http.StatusOK, gin.H{
"message": message,
"code": code,
})
})
// 启动并监听8046端口
r.Run(":8046")
}
验证:
<5>POST请求,解析body数据
package main
import (
"fmt"
"net/http" // 使用包中的状态信息
"github.com/gin-gonic/gin"
)
func main() {
// 初始化gin
r := gin.Default()
r.POST("/body",func(c *gin.Context) {
// 初始化一个map用于接收body的json数据
json := make(map[string]interface{})
// 绑定
err := c.BindJSON(&json)
if err != nil {
fmt.Println(err)
}
c.String(http.StatusOK,"the name is %s,age is %s",json["name"],json["age"])
})
r.Run(":8046")
}
验证:
<6>POST请求,单个文件上传
package main
import (
"net/http" // 使用包中的状态信息
"github.com/gin-gonic/gin"
)
func main() {
// 初始化gin
r := gin.Default()
r.POST("/upload", func(c *gin.Context) {
// 获取file名称的文件
file, _ := c.FormFile("file")
// 保存到服务端本地
c.SaveUploadedFile(file, file.Filename)
// c.String(http.StatusOK,"%s %d",file.Filename,file.Size)
// 返回文件名及其大小
c.JSON(http.StatusOK, gin.H{
"code": 200,
"filename": file.Filename,
"size": file.Size,
})
})
r.Run(":8046")
}
验证:
<7>POST请求,多个文件批量上传
package main
import (
"net/http" // 使用包中的状态信息
"github.com/gin-gonic/gin"
)
func main() {
// 初始化gin
r := gin.Default()
r.POST("/multupload", func(c *gin.Context) {
type f struct {
// 注意变量首字母大写
Name string `json:"name"`
Size int `json:"size"`
}
// 切片用于保存上传的文件信息
t := make([]f, 0)
form, _ := c.MultipartForm()
files := form.File["upload[]"]
for _, file := range files {
err := c.SaveUploadedFile(file, file.Filename)
if err != nil {
fmt.Println("文件保存失败")
}
a := f{Name: file.Filename, Size: int(file.Size)}
t = append(t, a)
}
c.JSON(http.StatusOK, gin.H{
"code": 200,
"message": t,
})
})
r.Run(":8046")
}
验证:
<8>GET请求,下载文件
package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http" // 使用包中的状态信息
"os"
"github.com/gin-gonic/gin"
)
func main() {
// 初始化gin
r := gin.Default()
// 下载文件
r.GET("/download", func(c *gin.Context) {
// 本地文件
imgPath := "test.jpg"
// 获取图片大小,单位字节
f, _ := os.Stat(imgPath)
size := f.Size()
// 读取图片
context, _ := ioutil.ReadFile(imgPath)
reader := bytes.NewBuffer(context)
// 设置响应类型,图片
contentType := "image/jepg"
// 额外的头部信息
extraHeader := map[string]string{
"Content-Disposition": `attachment; filename="test.jpg"`,
}
c.DataFromReader(http.StatusOK, size, contentType, reader, extraHeader)
})
r.Run(":8046")
}
验证:
<9>GET请求,cookie处理
package main
import (
"fmt"
"net/http" // 使用包中的状态信息
"github.com/gin-gonic/gin"
)
func main() {
// 初始化gin
r := gin.Default()
// cookies
r.GET("/cookie", func(c *gin.Context) {
cookie, err := c.Cookie("user_cookie")
// 如果cookie不存在
if err != nil {
fmt.Println("cookie不存在,重新设置")
cookie = "20220729"
// 响应返回set-cookie头部
c.SetCookie("user_cookie", "test", 3600, "/", "localhost", false, true)
}
fmt.Print(cookie)
c.JSON(http.StatusOK, gin.H{
"code": 200,
})
})
r.Run(":8046")
}
验证:
<10>GET请求,重定向处理
package main
import (
"fmt"
"net/http" // 使用包中的状态信息
"github.com/gin-gonic/gin"
)
func main() {
// 初始化gin
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"code": 200,
"message": "pong",
})
})
// 重定向到外部
r.GET("/test", func(c *gin.Context) {
// 301,永久重定向到百度
c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")
})
// 重定向内部路由-->ping
r.GET("/test1", func(c *gin.Context) {
c.Request.URL.Path = "/ping"
r.HandleContext(c)
})
r.Run(":8046")
}
验证: