【声明】
非完全原创,部分内容来自于学习其他人的理论和B站视频。如果有侵权,请联系我,可以立即删除掉。
参考文章:
(1)Gin框架(一):基础概览
(2)gin框架剖析(一)
一、简介、安装及快速入手
1、gin简介
Gin 是 Go语言写的一个 web 框架,它具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json
它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍。中文文档较为齐全
2、下载安装
要求golang的版本在1.15及以上,下载:
go get -u github.com/gin-gonic/gin
问题
(1)连接超时:开启gomodule,设置代理
go env -w GO111MODULE="on"
go env -w GOPROXY="https://goproxy.cn","https://goproxy.io"
(2)go mod的错误:解决方案
vscode的gopath和go mod无法共存
- 原因:go mod会将依赖包下载在
pkg/mod
下面,vscode默认导包路径是GOROOT/src
和GOPATH/src
,因此在导包时,vscode自动检查机制会显示找不到包 - 解决方法:
(1)vscode设置中搜索go.useLanguageServer
并关闭,该方法虽然不报告警但没有代码提示了
(2)将整个项目移到GOPATH
路径外面,然后项目下面敲go mod init xxx
和go install github.com/gin-gonic/gin@lastest
,即可完成导包
3、快速使用
3.1、官方快速入手的demo
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
3.2、运行结果
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ping --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
4、REST
4.1、概念
REST,即Representational State Transfer
的缩写,它是一种架构风格,跟编程语言无关,跟平台无关,采用HTTP做传输协议。“表现层状态转化”。如果一个架构符合REST原则,就称它为RESTful架构。
REST强调用URL定位资源、用HTTP动词(GET,POST,PUT,DELETE)描述操作
设计风格:
- 资源:是网络上的一个实体,如图片,数据,歌曲等。资源可以通过载体表示,如图片可以用JPG格式,文本可以用TXT格式,目前最流行的表示载体是JSON
- 统一接口:数据操作
CRUD(create, read, update, delete)
,对应到HTTP方法:GET获取资源,POST新建资源(或更新资源),PUT更新资源,DELETE删除资源。通过上述HTTP方法便统一了对数据的操作 - URI:
Uniform Resourse identifier
,统一资源位置。一个URI是某一个资源的地址或识别符,一个资源可以有多个URL - 无状态:所有的资源都可以通过URL直接定位,不依赖于其他资源或状态。例如,想要接收微信好友的消息,就必须先登录上微信,此时就构成了依赖关系,因此是有状态的
- 过滤信息:为了限定信息的多少或者获取特定的信息,可以通过前端参数过滤返回结果。
4.2、示例代码
4.2.1、代码
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "get",
})
})
r.POST("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "post",
})
})
r.PUT("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "put",
})
})
r.DELETE("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "delete",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
4.2.2、postman测试
二、gin渲染
1、html文件渲染
1.1、定义两个html文件
(1)html_file/index.tmpl
<!DOCTYPE html>
<html lang="zh-CN">
<body>
this is {
{.name}} page
</body>
(2)html_file/home.html
{
{define "gets/home.html"}}
<!DOCTYPE html>
<html lang="en">
<body>
this is {
{.title}} page
</body>
</html>
{
{end}}
(3)html_file/demo.tmpl
<!DOCTYPE html>
<html lang="en">
<body>
<div>
{
{/* 将'.text'对应的value作为参数传给htmlparse函数 */}}
{
{ .text | htmlparse }}
</div>
</body>
</html>
1.2、gin服务端的代码
func main() {
//1. 设置默认的路由引擎
r := gin.Default()
//自定义函数"htmlparse", 将传入的字符串解析为网页要显示的内容
r.SetFuncMap(template.FuncMap{
"htmlparse": func(str string) template.HTML {
return template.HTML(str)
},
})
//2. 加载html文件
//r.LoadHTMLFiles("html_file/index.tmpl", "html_file/home.html")
r.LoadHTMLGlob("html_file/*")
//3. 接收客户端的GET请求并处理
r.GET("/index", func(c *gin.Context) {
//方法1:通过文件名来查找html文件
c.HTML(http.StatusOK, "index.tmpl", gin.H{
"name": "index",
})
})
r.GET("/home", func(c *gin.Context) {
//方法2:通过文件中define的名字来查找html文件
c.HTML(http.StatusOK, "gets/home.html", gin.H{
"title": "home",
})
})
m := map[string]string{
"text": "<h1><a href='www.baidu.com'>百度一下</a></h1>"}
r.GET("/demo", func(c *gin.Context) {
c.HTML(http.StatusOK, "demo.tmpl", m)
})
//4. 设置端口及监听服务端的连接
r.Run(":8088")
}
1.3、浏览器客户端测试
2、静态文件渲染
静态资源一般包括:css、js、image
等文件
2.1、创建文件夹放置静态文件
(1)staic/css/style.css
*{
color:coral;
background-color: darkturquoise;
}
(2)staic/js/demo.js
alert("demo test")
(3)staic/img/swim.jpeg
2.2、index.html
文件
<!DOCTYPE html>
<head>
<link rel="stylesheet" href="demo/css/style.css">
<title>index</title>
</head>
<body>