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
}
}