Gin 快速预览《老铁版》

Published on with 0 views and 0 comments

1.大家好今天带大家快速了解一下 Gin 框架

2.Gin 是什么

  Gin 是 基于 Go 语言的一个 HttpServer 函数库。俗称 MVC 框架?

3.为什么使用 Gin

  因为想用,所以就用!

4.如何使用 Gin 呢

  首先 引入 github.com/gin-gonic/gin

  然后 在 main 函数中写入!

1r := gin.Default()
2r.GET("/ping", func(context *gin.Context) {
3	context.JSON(200, gin.H{
4		"message": "Pong",
5	})
6})
7r.Run()

  最后 go run main.go!

  这样 Gin 框架就会开启 Web 服务器了!

  Gin 框架默认端口是 8080!

5.如何测试是否启动

  首先 打开我们的 谷歌 浏览器!

  然后找到 地址栏!

  然后输入 http://localhost:8080/ping!

  然后查看页面是否不是 HTTP404!

  最后查看页面是否显示 PONG!

  这样我们就完成最简单的 Gin 框架使用和测试了!

6.功能 Example

  首先 我们放入葱花香菜江油然后,然后放入一头羊

  首先 我们直接出锅装盘了

a.HTML 渲染

 1package main
 2
 3import (
 4	"fmt"
 5	"github.com/gin-gonic/gin"
 6	"html/template"
 7	"net/http"
 8	"time"
 9)
10
11func main() {
12	// engine.Use(Logger(), Recovery()) 常规模式 使用了 Logger和Recovery
13	r := gin.Default()
14	// 常规get请求,返回JSON+Map[string]Interface{}类型
15	r.GET("/ping", func(context *gin.Context) {
16		context.JSON(200, gin.H{
17			"message": "Pong",
18		})
19	})
20	// 把返回内容 转换成 ascii 编码
21	r.GET("/asciiJson", func(context *gin.Context) {
22		mps := make(map[string]string)
23		mps["location"] = "北京"
24		mps["path"] = "哈哈哈"
25		context.AsciiJSON(200, mps)
26	})
27	// 模版渲染 使用变量时 自定义的符号
28	r.Delims("{[{", "}]}")
29	// 模版 pipe,使用方式为 xxx | formatDate
30	r.SetFuncMap(template.FuncMap{
31		"formatDate": formatAsDate,
32	})
33	// 加载模版文件
34	r.LoadHTMLGlob("mygin/templates/*")
35	// 返回 mygin/template/user.tmpl 模版,并使用 Map数据渲染它
36	r.GET("/tmpl/user", func(context *gin.Context) {
37		context.HTML(http.StatusOK, "user.tmpl", gin.H{
38			"name": "ferried",
39			"age":  18,
40			"desc": "花美男",
41		})
42	})
43	r.GET("/temp/func", func(context *gin.Context) {
44		context.HTML(http.StatusOK, "func.tmpl", gin.H{
45			"now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC),
46		})
47	})
48
49	r.Run()
50}
51
52func formatAsDate(t time.Time) string {
53	year, month, day := t.Date()
54	return fmt.Sprintf("%d/%02d/%02d", year, month, day)
55}

b.HTTP2 server 推送 / 静态资源解析

 1package main
 2
 3import (
 4	"html/template"
 5	"log"
 6
 7	"github.com/gin-gonic/gin"
 8)
 9
10// 使用 模版变量,并且起名 "https"
11var html = template.Must(template.New("https").Parse(`
12<html>
13<head>
14  <title>Https Test</title>
15  <script src="/assets/app.js"></script>
16</head>
17<body>
18  <h1 style="color:red;">Welcome, Ginner!</h1>
19</body>
20</html>
21`))
22
23func main() {
24	r := gin.Default()
25	// 设置静态资源目录
26	r.Static("/assets", "./assets")
27	// 设置HTML模版,
28	r.SetHTMLTemplate(html)
29	// 当服务器请求/的时候
30	r.GET("/", func(c *gin.Context) {
31		// 直接把 静态资源 app.js 推给客户端,不让客户端在req->res了,http2的 Pusher
32		if pusher := c.Writer.Pusher(); pusher != nil {
33			// 使用 pusher.Push() 做服务器推送
34			if err := pusher.Push("/assets/app.js", nil); err != nil {
35				log.Printf("Failed to push: %v", err)
36			}
37		}
38		// 使用name https模版来返回页面
39		c.HTML(200, "https", gin.H{
40			"status": "success",
41		})
42	})
43
44	// 监听并在 https://127.0.0.1:8080 上启动服务,后面两个是 Http2/https需要的证书文件
45	r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key")
46}

c.Stream 响应

 1package main
 2
 3import (
 4	"github.com/gin-gonic/gin"
 5	"net/http"
 6)
 7
 8func main() {
 9	r := gin.Default()
10	r.GET("/png", func(context *gin.Context) {
11		// 拿到图片response
12		response, _ := http.Get("http://a3.att.hudong.com/68/61/300000839764127060614318218_950.jpg")
13		// body是二进制类型
14		reader := response.Body
15		// 设置请求头
16		contentLength := response.ContentLength
17		contentType := response.Header.Get("Content-Type")
18		// 设置请求头
19		extraHeaders := map[string]string{
20			"Content-Disposition": `attachment; filename="gopher.png"`,
21		}
22		// 响应输出流,将文件进行下载
23		context.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders)
24
25	})
26	r.Run()
27}

d.参数验证

 1package main
 2
 3import (
 4	"github.com/gin-gonic/gin"
 5)
 6
 7// 结构体,binding: required必须填写
 8type UserForm struct {
 9	UserName string `form:"username" binding:"required"`
10	Password string `form:"password" binding:"required"`
11}
12
13func main() {
14	r := gin.Default()
15	r.GET("/form", func(context *gin.Context) {
16		// 指针结构体
17		userParam := &UserForm{}
18		// 验证参数是否有填写
19		if context.ShouldBind(userParam) == nil {
20			// 模拟登陆成功
21			if userParam.UserName == "user" && userParam.Password == "password" {
22				context.JSON(200, gin.H{"status": "you are logged in"})
23			} else {
24				context.JSON(401, gin.H{"status": "unauthorized"})
25			}
26		}
27	})
28	r.Run()
29}

e.取参数方式

 1	r.GET("/form", func(context *gin.Context) {
 2		// ?key=1
 3		query := context.Query("key")
 4		// post ?key=1
 5		value := context.PostForm("key")
 6		// 特殊编码 html
 7		// 单个文件
 8		file, _ := context.FormFile("file")
 9		// 表单获取
10		form, _ := context.MultipartForm()
11		// 获取文件集合
12		files := form.File["upload[]"]
13
14		context.PureJSON(http.StatusOK, gin.H{
15			query: value,
16		})
17	})
18

f.防止 JSON 劫持

 1func main() {
 2	r := gin.Default()
 3
 4	// 你也可以使用自己的 SecureJSON 前缀
 5	// r.SecureJsonPrefix(")]}',\n")
 6
 7	r.GET("/someJSON", func(c *gin.Context) {
 8		names := []string{"lena", "austin", "foo"}
 9
10		// 将输出:while(1);["lena","austin","foo"]
11		c.SecureJSON(http.StatusOK, names)
12	})
13
14	// 监听并在 0.0.0.0:8080 上启动服务
15	r.Run(":8080")
16}

  g.所有 HTTP

1router.GET("/someGet", getting)
2router.POST("/somePost", posting)
3router.PUT("/somePut", putting)
4router.DELETE("/someDelete", deleting)
5router.PATCH("/somePatch", patching)
6router.HEAD("/someHead", head)
7router.OPTIONS("/someOptions", options)

结束

  点赞加主编关注,如果积够 10 个赞那么我们下期 做​ 《XORM》营销号版,老铁双击点赞,关注,666。没毛病!


标题:Gin 快速预览《老铁版》
作者:fe
地址:https://blog.eiyouhe.com/articles/2020/03/14/1584180343202.html