Go gin框架(详细版)

news2024/11/28 6:38:07

目录

0. 为什么会有Go

1. 环境搭建

2. 单-请求&&返回-样例

3. RESTful API

3.1 首先什么是RESTful API

3.2 Gin框架支持RESTful API的开发

4. 返回前端代码

go.main

index.html

5. 添加静态文件

main.go 改动的地方

index.html 改动的地方

style.css 改动的地方

common.js 改动的地方

6. 获取请求中的参数

6.1 传统的传参

6.2 RESTful API 方式传参与接收

6.3 前端传递Json数据给后端

6.4 前端返回的是表单

在index.html添加表单

在main.go里面添加特定请求的放法

7. 关于重定向

7.1 重定向到网页

main.go

7.2 404

main.go

添加404.html,让重定向去跳转

7.3 路由组

main.go

8. 中间件(java里面的拦截器)

9. 总代码

main.go

templates/index.html

static/css

style.css

common.css


0. 为什么会有Go

1. 环境搭建

初始项目

go mod init 目前文件夹名

下载:

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

2. 单-请求&&返回-样例

这样我们的服务就可以跑起来了哈

此时提供给了前端GET请求的/hello路由,GET后面的函数就是我们对此请求的处理(返回给前端)

package main

//导入gin
import (
	"github.com/gin-gonic/gin"
)

func main(){
	//创建一个服务
	ginServer := gin.Default()
	//访问地址,处理我们的请求 Request Response
	ginServer.GET("/hello", func(context/*理解为我们上下文接收请求或者响应数据*/ *gin.Context) {
		/*我们所有的信息使用gin的默认对象包裹*/
		context.JSON(200,gin.H{"message":"hello world"})
	})
	//服务器端口
	ginServer.Run(":9090")/*默认是8080*/
}

(这个插件是之前提过的哈)

或者直接访问

3. RESTful API

然后我们现在写一个 RESTful API

3.1 首先什么是RESTful API

以前写网站:

比如查询用户就是:get /user

创建一个用户就是:post /create_user

又或者更新用户就是:post /update_user

又或者删除用户就是:post /delete_user

RESTful API 就是通过不同的请求执行不同的功能,以前我们是通过url和请求来隔离,现在我们可以通过四种方式来隔离,比如:

查询用户:get /user

提交用户:post /user

修改用户:put /user(这个就变了,不是post)

删除用户:delete /user

就是我们同一个请求(/user)用不同的方式(get post put),会执行不同的方法,这就是RESTful API

3.2 Gin框架支持RESTful API的开发

所以我们的代码就可以变成:

我们就发现 Go语言+Gin框架 去开发 RESTful API 是非常简单的 

(但是注意,有这些方法之后,浏览器就测试不了了,因为浏览器只会使用GET方法,就需要用到上面的工具了)

然后我们现在重新(不要上一个图的东西)写一个请求然后返回前端页面的代码

4. 返回前端代码

go.main

package main

//导入gin
import (
	"github.com/gin-gonic/gin"
)

func main() {
	//创建一个服务
	ginServer := gin.Default()

	//加载前端页面
	//加载所有的html文件,还有一个是加载特定的文件LoadHTMLFiles
	//就是ginServer.LoadHTMLFiles("templates/index.html")
	ginServer.LoadHTMLGlob("templates/*")

	//访问地址,处理我们的请求 Request Response
	ginServer.GET("/index", func(context *gin.Context) {
		//context.JSON(200,gin.H{"message":"hello world"}) 返回json数据
		//可以HTML查看定义,第一个是状态码,第二个是返回的文件名,第三个是想给文件传的参数
		//数据传送都是用框架的.H方法(map集合),H的定义也就是key value,所以可以传多个参数
		context.HTML(200, "index.html", gin.H{
			"msg": "这是后端传来的数据",
		}) //返回html数据
	})

	//服务器端口
	ginServer.Run(":9090") /*默认是8080*/
}

index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>个人主页</title>
</head>

<body>
    <h1>欢迎来到我的个人主页</h1>
获取后端的数据为:
{{.msg}}
</body>
</html>


5. 添加静态文件

现在我们还可以在网站里面加一些静态文件

.
├── go.mod
├── go.sum
├── main.go
├── static
│   ├── css
│   │   └── style.css
│   └── js
│       └── common.js
└── templates
    └── index.html

main.go 改动的地方

index.html 改动的地方

style.css 改动的地方

common.js 改动的地方

6. 获取请求中的参数

6.1 传统的传参

6.2 RESTful API 方式传参与接收

6.3 前端传递Json数据给后端

6.4 前端返回的是表单

在index.html添加表单

在main.go里面添加特定请求的放法

7. 关于重定向

注意重定向的状态码不是200

7.1 重定向到网页

main.go

7.2 404

main.go

添加404.html,让重定向去跳转

7.3 路由组

路由组就是我们可以统一管理路由,比如跟/user相关的所有路由,我们都放在这个里面

main.go

8. 中间件(java里面的拦截器)

中间件就是比如前端发送一个请求到/user/add,然后这个请求就到我们后端来处理了,但是我现在想这个请求没有到我的程序之前加一道防火墙,在拦截的地方预处理这个请求,这就是go的中间件。(一般这个预处理我们就会进行比如登录的验证,授权,分页,耗时统计...)

我们现在自己来实现一个中间件:

然后我们来使用:

现在我们在这里多加了一个中间件的函数,让我们调用这个方法的时候,先让myHandler去处理

如果中间件进行拦截,就会返回这个

9. 总代码

main.go

package main

//导入gin
import (
	"encoding/json"
	"log"
	"net/http"

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

func myHandler() gin.HandlerFunc {
	return func(context *gin.Context) {
		//通过自定义的中间件,设置的值,后续处理只要调用了这个中间件
		//的都可以拿到这个值
		context.Set("usersesion", "userid-1")
		//拦截器无非就两个方法,一个是放过一个是拦截
		if true {
			context.Next() //放行
		}
		context.Abort() //阻止
	}

}

func main() {
	//创建一个服务
	ginServer := gin.Default()
	//注册中间件
	//如果没有指定特定请求方法,那么就是所有方法都使用,指定了就是特定的
	ginServer.Use(myHandler())

	//加载前端页面
	//加载所有的html文件,还有一个是加载特定的文件LoadHTMLFiles
	//就是ginServer.LoadHTMLFiles("templates/index.html")
	ginServer.LoadHTMLGlob("templates/*")
	//跳转到这里,然后加载资源文件 static是前端文件夹,./static是文件夹的路径
	ginServer.Static("/static", "./static")

	//访问地址,处理我们的请求 Request Response
	ginServer.GET("/index", func(context *gin.Context) {
		//context.JSON(200,gin.H{"message":"hello world"}) 返回json数据
		//可以HTML查看定义,第一个是状态码,第二个是返回的文件名,第三个是想给文件传的参数
		//数据传送都是用框架的.H方法(map集合),H的定义也就是key value,所以可以传多个参数
		context.HTML(200, "index.html", gin.H{
			"msg": "这是后端传来的数据",
		}) //返回html数据
	})

	//获取请求中的参数
	//传统的传参方法:url?userid=xxx&username=xxx
	//请求-处理请求的函数,这个格式是固定的
	ginServer.GET("/user/info", myHandler(), func(context *gin.Context) {
		//加入中间件之后,开始说了调用的函数都可以取到中间件的值,现在我们取他
		//看源码返回的是any,我们转成string
		usersesion := context.MustGet("usersesion").(string)
		log.Println("==============>", usersesion)

		userid := context.Query("userid")
		username := context.Query("username")
		context.JSON(http.StatusOK, gin.H{
			"userid":   userid,
			"username": username,
		})
	})
	//RESTful传参方法:/url/info/1/xxx
	ginServer.GET("/user/info/:userid/:username", func(context *gin.Context) {
		userid := context.Param("userid")
		username := context.Param("username")
		context.JSON(http.StatusOK, gin.H{
			"userid":   userid,
			"username": username,
		})
	})

	//前端给后端传递 json数据
	ginServer.POST("/json", func(context *gin.Context) {
		//从 request.body中获取json数据
		//[]byte是字节切片,是一个二进制数据,可以理解为一个字符串
		b, _ := context.GetRawData()

		var m map[string]interface{}
		//切片b转换成map
		_ = json.Unmarshal(b, &m)
		context.JSON(http.StatusOK, m)
	})

	ginServer.POST("/user/add", func(context *gin.Context) {
		username := context.PostForm("username")
		password := context.PostForm("password")
		context.JSON(http.StatusOK, gin.H{
			"msg":      "ok",
			"username": username,
			"password": password,
		})
	})

	//关于重定向
	ginServer.GET("/redirect", func(context *gin.Context) {
		//重定向到百度
		context.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")
	})

	//404 就是 NoRoute
	ginServer.NoRoute(func(context *gin.Context) {
		context.HTML(http.StatusNotFound, "404.html", nil)
	})

	userGroup := ginServer.Group("/user")
	{
		//我们去网页访问的时候,就想当关于 /user/list
		userGroup.GET("/list", func(context *gin.Context) {
			context.JSON(http.StatusOK, gin.H{
				"msg": "获取用户列表",
			})
			//我们去网页访问的时候,就想当关于 /user/info
			userGroup.POST("/info", func(context *gin.Context) {
				context.JSON(http.StatusOK, gin.H{
					"msg": "获取用户信息",
				})
			})
		})
	}

	//服务器端口
	ginServer.Run(":9090") /*默认是8080*/
}

templates/index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>个人主页</title>

    <!--引入静态文件,css是link-->
    <link rel="stylesheet" href="/static/css/style.css">
    <!--引入静态文件,js是script-->
    <script src="/static/js/common.js"></script>
    <!--但是并不是引用了就能直接用,现在跳转到main.go中-->

</head>

<body>
    <h1>欢迎来到我的个人主页</h1>
获取后端的数据为:
{{.msg}}

<!--这就是个提交表单,提交之后就会让后端处理这个请求-->>
<form action="/user/add" method="post">
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="password" name="password"></p>
<p><input type="submit" value="提交"></p>
</form>

</body>
</html>


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>404 Not Found</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            background-color: #f0f0f0;
        }
        h1 {
            font-size: 6em;
            color: #333;
            margin-top: 20vh;
        }
        p {
            font-size: 1.5em;
            color: #666;
        }
        a {
            color: #007bff;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <h1>404</h1>
    <p>Oops! The page you're looking for could not be found.</p>
    <p>Go back to <a href="/">homepage</a>.</p>
</body>
</html>

static/css

style.css

body{
    background:aqua;
    /*让背景颜色变成蓝色*/
}

common.css

狂神YYDS!!!

创作不易,希望读者三连支持 💖
赠人玫瑰,手有余香 💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1581931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 | 字符函数和字符串函数

目录&#xff1a; 1. 字符分类函数 2. 字符转换函数 3. strlen的使用和模拟实现 4. strcpy的使用和模拟实现 5. strcat的使用和模拟实现 6. strcmp的使用和模拟实现 7. strncpy函数的使用 8. strncat函数的使用 9. strncmp函数的使用 10. strstr的使用 11. strtok函…

力扣121. 买卖股票的最佳时机

Problem: 121. 买卖股票的最佳时机 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义一个int数组max大小同prices&#xff1b;定义int变量curMax初始化为0&#xff1b; 2.从后往前遍历数组&#xff0c;若当前元素prices[i] > curMax时&#xff0c;则使将其赋值给curMa…

医院预约系统微信小程序APP前后端

医院预约系统具体功能介绍&#xff1a;展示信息、可以注册和登录&#xff0c; 预约&#xff08;包含各个科室的预约&#xff0c;可以预约每个各个医生&#xff09;&#xff0c;就诊引导包含预约的具体信息&#xff0c;包含就诊时间、就诊科室、就诊医生以及就诊人信息、和支付状…

如何注册midjourney账号

注册Midjourney账号比较简单&#xff0c;准备好上网工具&#xff0c;进入官网 Midjourney访问地址&#xff1a; https://www.midjourney.com/ 目前没有免费使用额度了&#xff0c;会员最低 10 美元/月&#xff0c;一般建议使用30美元/月的订阅方案。了解如何订阅可以查看订阅…

MyBatis源码介绍

文章目录 MyBatis的核心流程介绍SqlSessionFactory的理解MyBatis中的Executor的源码理解Spring中是如何解决MySQL的SqlSession的线程安全问题MyBatis面向Mapper编程工作原理Mybatis动态sql执行原理Mybatis的一级、二级缓存实现原理Mybatis的插件运行原理以及如何编写一个插件my…

019——IIC模块驱动开发(基于EEPROM【AT24C02】和I.MX6uLL)

目录 一、 IIC基础知识 二、Linux中的IIC&#xff08;韦东山老师的学习笔记&#xff09; 1. I2C驱动程序的层次 2. I2C总线-设备-驱动模型 2.1 i2c_driver 2.2 i2c_client 三、 AT24C02 介绍 四、 AT24C02驱动开发 实验 驱动程序 应用程序 一、 IIC基础知识 总线类…

【linux】谈MobaXterm支持的连接方式

目前远程联机服务器主要有文字命令行接口和图形界面接口两种。 一、命令行接口方式 1.1 加密传输-SSH SSH为主&#xff0c;目前大多在网络上的数据封包都是加密的技术&#xff0c;等到传输的封包加密后再传输到网络上&#xff0c;以增加数据在Internet上面传送的安全性 1.2…

【软考】哈希表

目录 一、概念1.1 定义 二、哈希函数的构造方法2.1 说明2.2 特性 三、处理冲突的方法3.1 说明3.2 开放定址法3.2.1 说明3.2.2 线性探测 3.3 链地址法3.4 再哈希法3.5 建立公共溢出区 四、哈希表的查找4.1 查找过程4.2 查找特点4.3 装填因子 一、概念 1.1 定义 1.一般存储结构由…

Solid Converter 10.1下载地址及安装教程

Solid Converter 10是一款专业的PDF转换工具&#xff0c;用于将PDF文件转换为可编辑的文档格式&#xff0c;如Word、Excel、PowerPoint等。它提供了强大的转换功能和一系列实用的工具&#xff0c;帮助用户将PDF内容转换为可重复使用和编辑的格式。 Solid Converter 10的主要功…

vcruntime140.dll文件缺失的多种解决方法,这五种修复vcruntime140.dll绝对有效

当你在使用电脑的时候&#xff0c;可能会遇到一个提示错误&#xff0c;显示“vcruntime140.dll文件缺失&#xff0c;程序因此无法启动”。这种状况不但打断了你的日常使用&#xff0c;还可能对你的工作效率造成不利影响。为了助你更好地搞清楚这个问题的由来以及解决方案&#…

贪心算法|860.柠檬水找零

力扣题目链接 class Solution { public:bool lemonadeChange(vector<int>& bills) {int five 0, ten 0, twenty 0;for (int bill : bills) {// 情况一if (bill 5) five;// 情况二if (bill 10) {if (five < 0) return false;ten;five--;}// 情况三if (bill …

基于java+springboot+vue实现的人事管理系统(文末源码+Lw)23-242

摘 要 使用旧方法对人事管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在人事管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的人事管理…

【C++】探索C++中的类与对象(下)---深入理解C++中的关键概念与应用

​​ &#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 在C编程中&#xff0c;有许多重要的概念和特性&#xff0c;包括构造函数、explicit关键字、静态成员、友元以及内部类…

【Web世界探险家】CSS美学(一)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

linux 迁移home目录以及修改conda中pip的目录,修改pip安装路径

1&#xff09;sudo rsync -av /home/lrf /data/home/lrf 将/home目录下的文件进行复制&#xff08;假设机械硬盘挂载在/data目录下&#xff09;** 2&#xff09;usermod -d /data/home/lrf -m lrf 修改用户$HOME变量** 3&#xff09;vi /etc/passwd 查看对应用户的$HOME变量是…

IDEA无法成功配置Tomcat的解决方法(IDEA版本问题)

在创建Servlet时&#xff0c;下载了Tomcat文件夹以及成功配置了环境变量之后&#xff0c;在IDEA中怎么都找不到Tomcat&#xff0c;尝试了网络中的各种方法&#xff0c;都不行&#xff0c;结果发现时IDEA版本的问题。因为我下的IDEA是社区版的&#xff0c;所以没有自带的Tomcat&…

【HTML】简单制作一个3D动态粒子效果的时空隧道

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;CSS的文件名改为[Bab…

【数据库】数据库应用系统生命周期

目录 1.为什么提出”软件工程“的思想&#xff1f; 2.为什么提出”瀑布模型“&#xff1f;缺点是什么&#xff1f; 3.为什么提出”快速原型模型“&#xff1f; 4.为什么提出”螺旋模型“&#xff1f; 5.关于数据库的英文缩写。 6.模型设计中的3条设计主线&#xff1a;数…

C++实现list容器

目录 1.前言 2.实现list容器 2.1链表结构体 2.2list迭代器 迭代器的成员变量 迭代器的构造函数 迭代器的&#xff0c;-- 迭代器的&#xff0c;&#xff01; 迭代器的解引用 迭代器的-> 3.list类 构造函数 析构函数 插入 删除 头插、尾插 头删、尾删 begin、end size empty 拷…