GIN

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网页

Go 复制代码
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的开发

Go 复制代码
	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

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

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

css 复制代码
body {
    background: rosybrown;
}

css,js之后也会出文章

JSON响应

1、返回普通数据类型

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

2、返回结构体

Go 复制代码
	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

Go 复制代码
	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、返回切片结构体

Go 复制代码
	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中

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

	router.LoadHTMLGlob("template/*")

获取url中的参数方法:

Go 复制代码
	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路径中的参数的方式如下。

Go 复制代码
	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表单提交的数据

Go 复制代码
	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请求,则获取请求参数的方式如下:

Go 复制代码
// 编写请求
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重定向

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

2、路由重定向

Go 复制代码
	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页面。

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

4、路由组

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

Go 复制代码
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
	}
}
相关推荐
寻星探路3 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
不老刘3 小时前
LiveKit 本地部署全流程指南(含 HTTPS/WSS)
golang·实时音视频·livekit
想用offer打牌4 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
lly2024064 小时前
Bootstrap 警告框
开发语言
2601_949146535 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
曹牧5 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX5 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了5 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
zmzb01035 小时前
C++课后习题训练记录Day98
开发语言·c++
爬山算法6 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate