Gin学习笔记

Gin学习笔记

Gin文档:https://pkg.go.dev/github.com/gin-gonic/gin

1、快速入门

1.1、安装Gin

go get -u github.com/gin-gonic/gin

1.2、main.go

package main

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

func main() {
	// 创建路由引擎
	r := gin.Default()

	// 添加路由监听
	r.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello Gin!")
	})

	//启用 web 服务
	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

Gin学习笔记_第1张图片

2、配置热更新

Air文档:https://github.com/cosmtrek/air

2.1、下载

# 添加air包
go get -u github.com/cosmtrek/air
# 编译并安装air到 $GOPATH/bin 目录(重启一下Goland)
go install github.com/cosmtrek/air@latest

2.2、使用

# 直接使用air即可热加载
air

3、响应数据

3.1、String

package main

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

func main() {
	r := gin.Default()

	r.LoadHTMLGlob("./template/*.html")

	r.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello Gin!")
	})
	r.GET("/hello", func(c *gin.Context) {
		//c.JSON(http.StatusOK, map[string]interface{}{
		//	"name": "xumeng03",
		//	"age":  "24",
		//})

		c.JSON(http.StatusOK, gin.H{
			"name": "xumeng03",
			"age":  "24",
		})
	})
	r.GET("/gin", func(c *gin.Context) {
		c.HTML(http.StatusOK, "gin.html", gin.H{
			"path": c.FullPath(),
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

3.2、JSON

package main

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

func main() {
	r := gin.Default()
	r.GET("/hello", func(c *gin.Context) {
		//c.JSON(http.StatusOK, map[string]interface{}{
		//	"name": "xumeng03",
		//	"age":  "24",
		//})

		c.JSON(http.StatusOK, gin.H{
			"name": "xumeng03",
			"age":  "24",
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

3.3、HTML

package main

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

func main() {
	r := gin.Default()

	r.LoadHTMLGlob("./template/*.html")

	r.GET("/gin", func(c *gin.Context) {
		c.HTML(http.StatusOK, "gin.html", gin.H{
			"path": c.FullPath(),
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Gin Studytitle>
head>
<body>
<h1>Gin Study!h1>
<p>请求路径:{{.path}}p>
body>
html>

4、请求数据

4.1、Get

1、直接查询
package main

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

func main() {
	r := gin.Default()

	r.GET("/", func(c *gin.Context) {
		// Query 查询 request 的参数,DefaultQuery 同样查询 request 的参数但若未查询到则赋一个默认值
		//var name = c.Query("name")
		var name = c.DefaultQuery("name", "Gin")
		c.String(http.StatusOK, "Hello %s!", name)
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

2、绑定到结构体
package main

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

func main() {
	r := gin.Default()

	r.GET("/", func(c *gin.Context) {
		var person = Person{}
		err := c.ShouldBind(&person)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"status":  500,
				"message": "Params Error!",
			})
            return
		}
		c.JSON(http.StatusOK, gin.H{
			"status": 200,
			"data":   person,
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

type Person struct {
	Name string `json:"name" form:"name"`
	Age  string `json:"age" form:"age"`
}

4.2、Post

1、直接查询
package main

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

func main() {
	r := gin.Default()

	r.POST("/", func(c *gin.Context) {
		// PostForm 查询 request 的参数,DefaultPostForm 同样查询 request 的参数但若未查询到则赋一个默认值
		var name = c.PostForm("name")
		var age = c.DefaultPostForm("age", "20")
		c.String(http.StatusOK, "Hello %s %s!", name, age)
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
2、绑定到结构体(form-data)
package main

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

func main() {
	r := gin.Default()

	r.POST("/", func(c *gin.Context) {
		var person = Person{}
		err := c.ShouldBind(&person)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"status":  500,
			})
            return
		}
		c.JSON(http.StatusOK, gin.H{
			"status":  500,
			"data": person,
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

type Person struct {
	Name string `json:"name" form:"name"`
	Age  string `json:"age" form:"age"`
}
3、绑定到结构体(json)
package main

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

func main() {
	r := gin.Default()

	r.POST("/json", func(c *gin.Context) {
		var person = Person{}
		err := c.ShouldBindJSON(&person)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"status": 500,
			})
			return
		}
		c.JSON(http.StatusOK, gin.H{
			"status": 200,
			"data":   person,
		})
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

type Person struct {
	Name string `json:"name" form:"name"`
	Age  string `json:"age" form:"age"`
}

5、Restful

http://127.0.0.1/item/1 查询,GET

http://127.0.0.1/item 新增,POST

http://127.0.0.1/item 更新,PUT

http://127.0.0.1/item/1 删除,DELETE

package main

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

func main() {
	r := gin.Default()

	r.GET("/get/:name", func(c *gin.Context) {
		param := c.Param("name")
		c.String(http.StatusOK, "Hello get %s!", param)
	})

	r.POST("/post/:name", func(c *gin.Context) {
		param := c.Param("name")
		c.String(http.StatusOK, "Hello post %s!", param)
	})

	r.PUT("/put/:name", func(c *gin.Context) {
		param := c.Param("name")
		c.String(http.StatusOK, "Hello put %s!", param)
	})

	r.DELETE("/delete/:name", func(c *gin.Context) {
		param := c.Param("name")
		c.String(http.StatusOK, "Hello delete %s!", param)
	})

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

6、路由分组

6.1、基本使用

package main

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

func main() {
	r := gin.Default()

	group := r.Group("/restful0")
	{
		group.GET("/get/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello get %s!", param)
		})

		group.POST("/post/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello post %s!", param)
		})
	}

	group1 := r.Group("/restful1")
	{
		group1.PUT("/put/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello put %s!", param)
		})

		group1.DELETE("/delete/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello delete %s!", param)
		})
	}

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

6.2、拆分文件

package main

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

func main() {
	r := gin.Default()

	router.Restful0(r)
	router.Restful1(r)

	err := r.Run()
	if err != nil {
		return
	} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
package router

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

func Restful0(r *gin.Engine) {
	group := r.Group("/restful0")
	{
		group.GET("/get/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello get %s!", param)
		})

		group.POST("/post/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello post %s!", param)
		})
	}
}
package router

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

func Restful1(r *gin.Engine) {
	group1 := r.Group("/restful1")
	{
		group1.PUT("/put/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello put %s!", param)
		})

		group1.DELETE("/delete/:name", func(c *gin.Context) {
			param := c.Param("name")
			c.String(http.StatusOK, "Hello delete %s!", param)
		})
	}
}

你可能感兴趣的:(gin,学习,笔记)