gin框架中中间件的编写与使用
概念
- 一个完整的系统可能包括鉴权认证、权限管理、安全检查、日志记录等多维度的系统支持。
- 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加的方式不会影响编码的效率,也不会侵入到框架中。
中间件的位置和角色示意图
自定义一个中间件
- gin中间件的类型是函数,有两条标准
- func函数
- 返回值是HandlerFunc类型
- 案例:定义一个log日志的中间件,打印path和Method
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.New()
// 全局使用自定义的中间件
router.Use(Logger())
router.GET("/hello", HelloHandle)
// 单个接口使用自定义的中间件
router.GET("/index", RemoteAddr(), IndexHandle)
router.Run(":8000")
}
func Logger() gin.HandlerFunc {
// 打印请求路径和方法的中间件
return func(ctx *gin.Context) {
fmt.Println(ctx.FullPath(), ctx.Request.Method)
}
}
func RemoteAddr() gin.HandlerFunc {
// 打印远程地址的中间件
return func(context *gin.Context) {
fmt.Println(context.Request.RemoteAddr)
}
}
func HelloHandle(ctx *gin.Context) {
ctx.Writer.Write([]byte("hello world!"))
}
func IndexHandle(ctx *gin.Context) {
ctx.Writer.Write([]byte("hello index!"))
}
context.Next函数
- contentx.Next函数可以将中间件代码的执行顺序一分为二,Next函数之前的代码在请求处理之前执行,当执行到Next函数时会中断向下执行,去执行具体的业务逻辑代码,当业务逻辑代码执行完成后,在继续执行Next函数后面的代码。
- 案例
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
router := gin.Default()
// 全局使用自定义的中间件
router.Use(Logger())
router.GET("/hello", HelloHandle)
// 单个接口使用自定义的中间件
router.GET("/index", RemoteAddr(), IndexHandle)
router.Run(":8000")
}
func Logger() gin.HandlerFunc {
// 打印请求路径和方法的中间件
return func(ctx *gin.Context) {
fmt.Println(ctx.FullPath(), ctx.Request.Method)
fmt.Println("状态码", ctx.Writer.Status())
ctx.Next()
fmt.Println("状态码", ctx.Writer.Status())
}
}
func RemoteAddr() gin.HandlerFunc {
// 打印远程地址的中间件
return func(context *gin.Context) {
fmt.Println(context.Request.RemoteAddr)
// 中断执行,去执行接口业务代码,接口业务执行完毕后在回来执行context.Next()后面的代码
context.Next()
status := context.Writer.Status()
fmt.Println("状态码:", status)
}
}
func HelloHandle(ctx *gin.Context) {
ctx.String(http.StatusNotFound, "404 not found")
fmt.Println("hello接口执行完了")
}
func IndexHandle(ctx *gin.Context) {
fmt.Println("index函数执行了")
ctx.Writer.Write([]byte("hello index!"))
}
gin框架中中间件的编写与使用的更多相关文章
- 在gin框架中使用JWT
在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 什么 ...
- golang gin框架中实现一个简单的不是特别精确的秒级限流器
起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...
- gin框架中的路由
基本路由 gin框架中采用的路由库是基于httrouter做的 地址为:https://github.com/julienschmidt/httprouter httprouter路由库 点击查看代码 ...
- gin框架中请求路由组的使用
1. gin框架中可以使用路由组来实现对路由的分类 package main import "github.com/gin-gonic/gin" func main() { rou ...
- gin框架中的中间件
全局中间件 所有请求都经过此中间件 中间件中设置值 func MiddleWare() gin.HandlerFunc { return func(context *gin.Context) { t ...
- Gin框架中文文档
Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 带目录请移步 http://xf.shuangdeyu.com/ ...
- 【解决了一个小问题】gin框架中出现如下错误:"[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 500"
POST到数据到一条gin框架的接口后,客户端收到400错误,并且返回了业务中返回的"decode json fail". 关键代码是: func report(c *gin.Co ...
- golang gin框架中实现大文件的流式上传
一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...
- gin框架中使用jwt
生成解析token 如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一.JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本 ...
随机推荐
- IDEA把Main方法打包成jar包
创建一个maven项目 写一个main方法 Module:选择main方法所在的模块,我这里只有一个模块 所以默认选中 Main Class:选择main方法所在的类 Directory for ME ...
- Elasticsearch 和 solr 的区别
背景:它们都是基于Luence搜索服务器基础之上开发的一款优秀高性能的企业级搜索服务器.也都是基于分词技术构建的倒排索引的方式进行查询 开发语言:java 诞生时间: solr :2004年 es ...
- Github访问加速(解决md图片显示问题)
参考自知乎:https://zhuanlan.zhihu.com/p/107691233 基本步骤 查找域名对应IP https://www.ipaddress.com http://tool.chi ...
- Vue总结第五天:vue-router (使用模块化(创建Vue组件)机制编程)、router-link 标签的属性、路由代码跳转、懒加载、路由嵌套(子路由)、路由传递数据、导航守卫)
Vue总结第五天:vue-router ✿ 路由(器)目录: □ vue中路由作用 □ vue-router基本使用 □ vue-router嵌套路由 □ vue-router参数传递 □ ...
- Kafka Eagle分布式模式
1.概述 最近有同学留言,Kafka Eagle的分布式模式功能怎么使用,如何部署安装?今天笔者就为大家来详细介绍一下Kafka Eagle的分布式模式功能的安装和使用. 2.内容 首先,这里我们需要 ...
- C++之去重
note 今天刷题,忘了去重复库函数,于是手写了一个. 前提: 必须保证数组是有序的. 源码 template <typename T> void unique_arr(T arr[], ...
- 【LeetCode】1161. Maximum Level Sum of a Binary Tree 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS 日期 题目地址:https://leetcod ...
- 【LeetCode】157. Read N Characters Given Read4 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 直接调用 日期 题目地址:https://leetco ...
- Orthogonal Convolutional Neural Networks
目录 概 主要内容 符号说明 的俩种表示 kernel orthogonal regularization orthogonal convolution Wang J, Chen Y, Chakrab ...
- Electron-Vue 项目使用Element的el-table组件不显示
1.electron-vue文件夹下的webpack.renderer.config.js配置文件,你会找到这样一行代码,需要添加白名单! let whiteListedModules = ['vue ...
