gin框架开发基础功能实践汇总

 gin定位:一款高性能的go web框架

基本实践一次搞定!

目录

项目结构

main.go(多组路由)

以order.go测试GET各请求

以customer.go测试POST/PUT请求

调用目标API前先校验(多处理器)

多路由API执行前校验


项目结构

main.go(多组路由)

分两组路由,验证路由分组功能

package main

import (
	"gin-coms/config"
	"gin-coms/routers"
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()
	// 第一组路由:以/api开头
	apiGroup := router.Group("/api")
	{
		routers.CusRoute(apiGroup)
		routers.OrderRoute(apiGroup)
	}

	// 第二组路由:以/other开头
	otherGroup := router.Group("/other")
	{
		routers.OtherRoute(otherGroup)
	}

	//config.InitMysql()
	router.Run(config.ComsAddress + ":" + config.ComsPort)
}

以order.go测试GET各请求

package routers

import (
	"fmt"
	"gin-coms/model"
	"github.com/gin-gonic/gin"
	"net/http"
)

func OrderRoute(group *gin.RouterGroup) {
	group.GET("/order", OrderList)
	group.GET("/order/:ID", OrderDetail)
    // URL的问号会带参数name
    // http://localhost:8000/api/orderByName?name=无名
	group.GET("/orderByName", OrderByName) 
}

func OrderByName(c *gin.Context) {
	name := c.Query("name") //获取URL参数
    // 也可通过 c.ShouldBindQuery(&xx) 直接绑定到结构体对象,但需要绑定的字段中加form标签 
	fmt.Println("您要查询的订单名称是:", name)
	c.JSON(http.StatusOK, "hello 这里是/api/orderByName路由,您要查询的订单名称是:"+name)
	//c.String(http.StatusOK, "hello 这里是/api/order路由")
}

func OrderDetail(c *gin.Context) {
	id := c.Param("ID") //获取URL路径参数
	fmt.Println("您要查询的是", id, "号订单。")
	c.JSON(http.StatusOK, "hello 这里是/api/order/:ID路由,您要查询的是"+id+"号订单。")
	//c.String(http.StatusOK, "hello 这里是/api/order路由")
}

func OrderList(c *gin.Context) {
	var orderList []model.Order
	order1 := model.Order{Name: "订单1", OrderPrice: 88}
	order2 := model.Order{Name: "订单2", OrderPrice: 99}
	orderList = append(orderList, order1, order2)
	c.String(http.StatusOK, "hello 这里是/api/order路由,此处返回订单列表:", orderList)

	// 如果要返回自定义结构体类型ReturnStruct,需要改源码,在type HandlerFunc func(*Context)后加返回值ReturnStruct即可。
	//return model.ReturnStruct{Code:http.StatusOK,Message:"hello 这里是/api/order路由,此处返回订单列表!",Data:orderList}
}

URL1:http://localhost:8000/api/orderByName?name=无名

URL2:http://localhost:8000/api/order/9

order列表:

控制台日志如下:

以customer.go测试POST/PUT请求

分别以两种方式获取请求体参数

package routers

import (
	"fmt"
	"gin-coms/model"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
)

func CusRoute(group *gin.RouterGroup) {
	group.POST("/cus", CreateCustomer)
	group.PUT("/cus", UpdateCustomer)
}

func CreateCustomer(c *gin.Context) {
	var cus model.Customer
	err := c.BindJSON(&cus) // 获取请求体参数,请求头为application/json
	if err != nil {
		log.Println(err.Error())
	}
	fmt.Println("用户", cus, "已创建。")
	c.JSON(http.StatusOK, "用户已创建。")
}

func UpdateCustomer(c *gin.Context) {
	name := c.PostForm("name")	// 获取请求体参数,请求头为application/x-www-form-urlencoded
	gender := c.PostForm("gender")
	fmt.Println("用户", name,"  ",gender, "已修改。")
	c.JSON(http.StatusOK, "用户已修改。")
}

测试POST

测试PUT

控制台打印:

调用目标API前先校验(多处理器)

我想在走进orderList接口之前先执行下CheckOrder,CheckOrder里面是我自己的校验逻辑,,应该怎么做?

修改order.go中的orderlist路由,增加CheckOrder处理器:

group.GET("/order",CheckOrder, OrderList)    // 增加一个处理器

func CheckOrder(c *gin.Context){
	fmt.Println("---进入check函数---")
	if c.Request.Header.Get("token") == "enyduuamlm2cdcs=="{
		fmt.Println("验证通过!")
		return
	}
	c.Abort()    // 执行该行之后下一个处理器将不会执行
	c.JSON(http.StatusUnauthorized,"验证失败!")
}

以正确情况验证一下:

日志打印:

如果不按CheckOrder中的校验规则来,或者header中有token字段但内容错误:

即,错误情况下报401,请求终止。

上面这种方式对于单个需要校验的处理器而言还行,如果是大规模路由呢?

多路由API执行前校验

以第二组路由other模块试试。other模块有两个模块的路由:OneRoute和OtherRoute,目前简便起见各只有一个接口,我只想让OtherRoute下的所有路由走CheckByToken处理器,OneRoute不用验证就能访问,应该怎么做?

修改代码,变动如下:


func main() {
	router := gin.New()
	router.Use(gin.Logger())
	router.Use(gin.Recovery())
	// 第一组路由:以/api开头
	apiGroup := router.Group("/api")
	{
		routers.CusRoute(apiGroup)
		routers.OrderRoute(apiGroup)
	}

	// 第二组路由:以/other开头
	otherGroup := router.Group("/other")
	{       routers.OneRoute(otherGroup)
            // 可以放多个中间件,如otherGroup.Use(CheckByToken(),CheckBySession()),按顺序执行
            // CheckByToken()对otherGroup.Use(CheckByToken())之后的路由起作用
		otherGroup.Use(CheckByToken())	
		routers.OtherRoute(otherGroup)
	}

	//config.InitMysql()
	router.Run(config.ComsAddress + ":" + config.ComsPort)
}

func CheckByToken() gin.HandlerFunc{
	return func(c *gin.Context){
                fmt.Println("---进入CheckByToken函数---")
		if c.Request.Header.Get("token") == "token-abcde"{
			fmt.Println("验证token成功!")
			// 验证通过时继续往下走访问下一个中间件
			c.Next()
		} else {
			// 验证不通过时请求终止
			c.Abort()
			c.JSON(http.StatusUnauthorized,"验证失败!")
		}
	}
}

func CheckBySession() gin.HandlerFunc{
	return func(c *gin.Context){
		
	}
}

other路由模块:

func OtherRoute(group *gin.RouterGroup){
	group.GET("/test", OtherList)
}

func OneRoute(group *gin.RouterGroup){
	group.GET("/one", oneList)
}

func oneList(c *gin.Context){
	fmt.Println("成功进入oneList接口")
	c.String(http.StatusOK, "hello, 这里是/other/one路由")
}

func OtherList(c *gin.Context){
	fmt.Println("成功进入OtherList接口")
	c.String(http.StatusOK, "hello, 这里是/other/test路由")
}

访问/other/test并且带正确token验证一下:

访问/other/test并且带错误token验证一下:

上面两步控制台打印如下:

即用户访问/other/test时肯定会先执行CheckByToken处理器,接下来分别以正确和不正确的token来

验证下/other/one:

控制台日志:

即,根本不会进CheckByToken处理器,它对/other/one接口(OneRoute下的所有路由)是没有任何作用的,那么上面的做法就得到了验证,我们的目的也就达成了。

gin的多处理器逻辑这块和马卡龙(macaron)是非常类似的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Webpack5 基本使用 - 3(完结)

环境区分 可以定义多个配置文件,通过 webpack-merge 合并配置文件。 安装 webpack-merge yarn add webpack-merge公共配置 // webpack.common.js const path require(path) const HtmlWebpackPlugin require(html-webpack-plugin)module.exports {entry: path…

牛客——都别吵吵了,我才是签到(质因数分解和统计质因数次数)

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 陶陶刚上一年级,今天数学课上老师教了乘法和除法,老师留了一道课后习题,陶陶很快地写完了,现在想请你帮助他检查一下是否和答案一致。…

Ubuntu 申请 SSL证书并搭建邮件服务器

文章目录 Log 一、域名连接到泰坦(Titan)电子邮件二、NameSilo Hosting 避坑三、Ubuntu 搭建邮件服务器1. 环境准备2. 域名配置3. 配置 Postfix 和 Dovecot① 安装 Nginx② 安装 Tomcat③ 申请 SSL 证书(Lets Encrypt)④ 配置 pos…

ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连

用了网上的办法: 1、修改listener.ora的参数,把动态的参数设置为静态的参数,红色标注部分 位置D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME PLSExtProc) (ORACLE_HOME D:\oracle\produ…

C++练习题1-9

文章目录 NO1、选出妃子、宫女和嬷嬷No2、根据数字判断月份No3、循环计数No4、循环选数No5、玩转字符No6、计算字符串长度No7、显示字符串中的字符No8、字符串反转No9、二维数组的应用 NO1、选出妃子、宫女和嬷嬷 其他要求: 超女用结构体表示不要嵌套if输入所有数据…

博物馆环境监控系统的需求是怎么来的???

一、博物馆环境基本调研和识别需求 在环境监测软件的需求中,首要任务是进行深入的基本调研。这包括把握已有的环境监测技术、标准与法规,以及用户的实际操作过程和困惑。积极与环保局、科研院所、公司等沟通,可搜集很多原始记录,…

MySQL的SQL分类与数据类型

MySQL是一款广泛使用的关系型数据库管理系统,开源、免费且跨平台,常用于存储、管理和检索结构化数据,并通过SQL语言支持高效的数据操作与管理。 文章目录 何为SQLSQL分类DDLDMLDCLTCLDQL MySQL的数据类型数值型日期型字符串型二进制型其他类型…

网安培训第一期——sql注入+文件

文章目录 sql inject报错注入time盲注联合查询万能密码拦截和过滤ascii注入流程base64查询的列名为mysql保留关键字key 文件上传ffuf脚本要做的三件事网络端口进程用户权限文件文件包含文件下载XSS跨站请求攻击csrf跨站请求伪造 sql inject 判断输入字段是字符串还是数字 方法…

【GitHub项目推荐--开源小游戏】【转载】

01 回合制生存游戏 Cataclysm-DDA 是一款回合制生存游戏,背景设置在后世界末日的世界中。虽然有些人将其描述为“僵尸游戏”,但《大灾变》远不止这些。努力在一个严酷、持久、程序生成的世界中生存。 为食物、设备寻找一个死去的文明的残余物。或者&am…

arcgis 面要素shp数据处理

面要素是工作中用到最多的,那么面要素是如何形成的呢,主要还是由闭合的线要素转换而成。在面要素数据中常用的有以下几点: 一、 线转面(要素转面) 通过上一篇得到了点转线的要素,那么根据上节的线要素&am…

大模型学习笔记一:大模型应用开发基础

文章目录 一、大模型一些概念介绍 一、大模型一些概念介绍 1)产品和大模型的区别(产品通过调用大模型来具备的能力) 2)AGI定义 概念:一切问题可以用AI解决 3)大模型通俗原理 根据上文,猜测下…

1174:长整数排序(指针专题)

题目描述 长整数排序。输入n 然后输入n个位数不超过100位的大整数,输入的整数可能含有前导0。将这n个长整数排序后输出,输出不含前导0。int greater(char *s1, char *s2){若s1指向的整数大于s2指向的整数,返回一个正整数;若s1指向的整数小于s…

重生之C++王者归来DAY1

c的概述 c的编程思想:面向对象、泛型编程。 1.第一个c程序 本文用的是QT,VS之类的也可 2.c面向对象的三大特性(重要) 封装:将相同属性的数据和方法封装在一起,加权限区分,用户只能借助公共方法操作 私有…

PCL 高斯投影正算:大地坐标转高斯投影坐标(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示四、测试数据PCL 高斯投影正算:大地坐标转高斯投影坐标(C++详细过程版)由CSDN点云侠原创。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 二、代码实现 头文件及读取保存函数见:

SAP同步异常2:SAP删除获利能力特征字段后VF02发货过帐报错。

测试环境VF02过帐报错, 原因是之前删除已经激并使用的获利能力特征字段后,只处理了数据库,没有处理程序。 处理方案: 1、 KEA0 维护经营关注点: 这里WW291已经删除,但没有激活程序。 退出后&#xff…

web安全学习笔记【09】——算法2

基础[1] 入门-算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA #知识点: 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OSS&反向&负载…

2.数据结构 顺序表(自留笔记)

文章目录 一.静态顺序表:长度固定二.动态顺序表1.下面证明原地扩容和异地扩容代码如下:2.下面是写一段Print,打印数字看看:3.头插4.尾删5.头删6.越界一定会报错吗7.下标插入8.下标删除9.查找数字10.应用:利用顺序表写一…

跨平台同步 Shell 历史记录,无缝切换会话 | 开源日报 No.154

atuinsh/atuin Stars: 14.3k License: MIT Atuin 是一个用 SQLite 数据库替换现有 shell 历史记录的工具,可以记录命令的额外上下文,并提供可选且完全加密的历史同步功能。其主要功能和核心优势包括: 重新绑定 ctrl-r 和 up (可配置) 到全屏…

安装宝塔面板后k8s所在节点pod无法正常工作解决方法,kubernetes k8s 与宝塔面板冲突解决方法

在实际项目过程中我们使用了k8s 在生产环境中运行管理服务。 但是对服务器的状态管理我们使用了宝塔面板进行 K8s 版本1.2.8 宝塔面板 版本 8.05 操作步骤是这样的。 1.完成1.2.8 k8s的节点安装,并正常运行服务。 过程略 2.安装宝塔面板 ​ yum install -y …

不要在细节上雕花

前段时间在网上看到一张趣图,有人在社交网络分享学习编程的笔记,一行行手抄代码,字迹清晰,排版工整,霎是认真。 这可能只是个梗,但它让我想起我的学生年代。许多年前我还在念书的时候,班上有不少非常认真的同学,热衷于把课堂笔记做得非常漂亮、工整,有些甚至要用尺子对…
最新文章