Go语言学习笔记【19】 gin框架

【声明】

非完全原创,部分内容来自于学习其他人的理论和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/srcGOPATH/src,因此在导包时,vscode自动检查机制会显示找不到包
  • 解决方法:
    (1)vscode设置中搜索go.useLanguageServer并关闭,该方法虽然不报告警但没有代码提示了
    (2)将整个项目移到GOPATH路径外面,然后项目下面敲go mod init xxxgo 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

gin快速入手

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方法便统一了对数据的操作
  • URIUniform 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测试

get/post/put/delete测试

二、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、浏览器客户端测试

index
home
demo

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>
    <
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值