GIN

发布于:2024-12-19 ⋅ 阅读:(8) ⋅ 点赞:(0)

gin是什么 

Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。如果你需要极好的性能,使用 Gin 吧。

特点:gin是golang的net/http库封装的web框架,api友好,注释明确,具有快速灵活,容错方便等特点。

go其他web框架:

  • beego:开源的高性能Go语言Web框架。
  • Iris:全宇宙最快的Go语言Web框架,支持MVC。

gin的安装

        go语言包的安装都十分简单,对与gin的安装,仅需要一行命令(开启go mod,并且配置了正确的代理)

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

gin框架中文文档:https://gin-gonic.com/zh-cn/docs/

gin的使用

使用gin创建一个hello world网页

package main

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

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

	router.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "Hello World!"})
	})

	router.Run("127.0.0.1:8080")
}

启动成功:

 十分的快捷简单!!!!😆😆😆😆

RESTful API

55RESTful:用url去定位资源、用HTTP动词GET、POST、DELETE、PUT去描述操作。

RESTful API就是REST风格的API,rest是一种架构风格,跟编程语言无关,跟平台无关,采用HTTP做传输协议。

REST的含义就是客户端与Web服务器之间进行交互的时候,使用HTTP协议中的4个请求方法代表不同的动作。

  • GET获取资源
  • POST新建资源
  • PUT更新资源
  • DELETE删除资源

只要API程序遵循了REST风格,就可以成为RESTful API。

Gin框架支持RESTful API的开发

	router.GET("/get", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "get"})
	})

	router.POST("/post", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "post"})
	})

	router.PUT("/put", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "put"})
	})

	router.DELETE("/delete", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "delete"})
	})

 

响应HTML页面

目录:

main.go

package main

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

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

	router.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", gin.H{
			"message": "myHTML",
		})
	})

	// Gin框架中使用LoadHTMLGlob()或者LoadHTMLFiles()方法进行HTML模板渲染。
	//router.LoadHTMLGlob("template/*")
	router.LoadHTMLFiles("template/index.html")

	// 当我们渲染的HTML文件中引用了静态文件时
	// 我们只需要按照以下方式在渲染页面前调用gin.Static方法即可。
	router.Static("/static", "./static")

	router.Run("127.0.0.1:8080")
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的Go页面</title>
    <link rel="stylesheet" href="/static/css/style.css">
    <script src="/static/js/common.js"></script>
</head>
<body>
    <h1>首页</h1>
</body>
</html>

 style.css

body {
    background: rosybrown;
}

 

        css,js之后也会出文章

JSON响应

1、返回普通数据类型

router.GET("/hello", func(c *gin.Context) {
		c.JSON(200,"request success")
	})

2、返回结构体

	router.GET("/hello", func(c *gin.Context) {
		user := struct {
			Username string `json:"username"`
			PassWord string `json:"password"`
		}{
			Username: "zhangsan",
			PassWord: "123456",
		}
		
		c.JSON(http.StatusOK, user)
	})

3、返回map

	router.GET("/hello", func(c *gin.Context) {
		type user struct {
			Username string `json:"username"`
			PassWord string `json:"password"`
		}

		m := map[int]user{}

		m[1] = user{"zhangsan", "123456"}
		m[2] = user{"lisi", "123456"}

		c.JSON(http.StatusOK, m)
	})

4、返回切片结构体

	router.GET("/hello", func(c *gin.Context) {
		type user struct {
			Username string `json:"username"`
			PassWord string `json:"password"`
		}

		users := make([]user, 2)
		users[0] = user{"zhangsan", "123456"}
		users[1] = user{"lisi", "123456"}

		c.JSON(http.StatusOK, users)
	})

获取请求参数

1、获取url中的参数

        当form表单中的method属性为get我们提交的字段值会显示在url中

	router.GET("/login", func(c *gin.Context) {
		c.HTML(200, "login.html", nil)
	})

	router.LoadHTMLGlob("template/*")

获取url中的参数方法:

	router.GET("/login", func(c *gin.Context) {

		username := c.Query("username")
		password, ok := c.GetQuery("password")
		if !ok {
			password = "获取password失败"
		}

		c.JSON(http.StatusOK, gin.H{
			"username": username,
			"password": password,
		})

	})

2、接收restful风格的参数

请求的参数通过URL路径传递,例如:/login/zhangsan/123456。 获取请求URL路径中的参数的方式如下。

	router.GET("/login/:username/:password", func(c *gin.Context) {

		// 通过 param 获取参数
		username := c.Param("username")
		password := c.Param("password")

		//返回json数据
		c.JSON(http.StatusOK, gin.H{
			"username": username,
			"password": password,
		})
	})

3、接收form表单提交的数据

	router.POST("/login", func(c *gin.Context) {

		username := c.PostForm("username")
		password := c.PostForm("password")

		c.JSON(http.StatusOK, gin.H{
			"username": username,
			"password": password,
		})
	})

4、获取json参数

当前端请求的数据通过JSON提交时,例如向/json发送一个POST请求,则获取请求参数的方式如下:

// 编写请求
router.POST("/json", func(c *gin.Context) {
   // GetRawData : 从c.Request.Body读取请求数据, 返回 []byte
   b, _ := c.GetRawData()
   // 定义map或结构体接收
   var m map[string]interface{}
   // 包装为json数据
   _ = json.Unmarshal(b, &m)

   c.JSON(http.StatusOK, m)
})

路由

1、重定向

http重定向

	//重定向
	router.GET("/test", func(c *gin.Context) {
		c.Redirect(http.StatusMovedPermanently, "http://www.google.com")
	})

2、路由重定向

	router.GET("/test", func(c *gin.Context) {
		c.Request.URL.Path = "/test2"
		router.HandleContext(c)
	})

	router.GET("/test2", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"message": "test2"})
	})

3、404页面

没有匹配到路由的请求都返回404.html页面。

	router.NoRoute(func(c *gin.Context) {
		c.HTML(http.StatusNotFound, "404.html", nil)
	})

4、路由组

我们可以将拥有共同URL前缀的路由划分为一个路由组,也可以多重嵌套。

package main

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

func Group(router *gin.Engine) {

	userGroup := router.Group("/user")
	{ //习惯性一对`{}`包裹同组的路由,这只是为了看着清晰,你用不用`{}`包裹功能上没什么区别
		userGroup.GET("/1", func(c *gin.Context) {}) //   /user/1
		userGroup.GET("/2", func(c *gin.Context) {}) //   /user/2
		userGroup.GET("/3", func(c *gin.Context) {}) //   /user/3
	}
}