概念

  1. 一个完整的系统可能包括鉴权认证、权限管理、安全检查、日志记录等多维度的系统支持。
  2. 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加的方式不会影响编码的效率,也不会侵入到框架中。

中间件的位置和角色示意图

自定义一个中间件

  • gin中间件的类型是函数,有两条标准
  1. func函数
  2. 返回值是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框架中中间件的编写与使用的更多相关文章

  1. 在gin框架中使用JWT

    在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 什么 ...

  2. golang gin框架中实现一个简单的不是特别精确的秒级限流器

    起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...

  3. gin框架中的路由

    基本路由 gin框架中采用的路由库是基于httrouter做的 地址为:https://github.com/julienschmidt/httprouter httprouter路由库 点击查看代码 ...

  4. gin框架中请求路由组的使用

    1. gin框架中可以使用路由组来实现对路由的分类 package main import "github.com/gin-gonic/gin" func main() { rou ...

  5. gin框架中的中间件

    全局中间件 所有请求都经过此中间件 中间件中设置值 func MiddleWare() gin.HandlerFunc { return func(context *gin.Context) { t ...

  6. Gin框架中文文档

    Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 带目录请移步 http://xf.shuangdeyu.com/ ...

  7. 【解决了一个小问题】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 ...

  8. golang gin框架中实现大文件的流式上传

    一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...

  9. gin框架中使用jwt

    生成解析token 如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一.JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本 ...

随机推荐

  1. 【手把手教程】uniapp + vue 从0搭建仿斗鱼虎牙直播App:腾讯云MLVB移动直播实践连麦PK+带货

    基于uniapp + vue 实现仿斗鱼虎牙腾讯云移动直播应用实践,实现以下功能 1: 用户登陆 2: 房间管理 3: 房间聊天 4: 直播美颜 5: Svga礼物动画 6: 一对一连麦观众 项目开发 ...

  2. JAVA将文件转换成byte数组(byte[])

    /** * 将文件转换成byte数组 * @param filePath 文件File类 通过new File(文件路径) * @return byte数组 */ public static byte ...

  3. 【LeetCode】364. Nested List Weight Sum II 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...

  4. 【LeetCode】1021. Best Sightseeing Pair 最佳观光组合(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. 【LeetCode】268. Missing Number 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 求和 异或 日期 题目地址:https://leet ...

  6. computer(hdu2196)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. 【错误】NetBeans2007:Cannot find nbproject/build-impl.xml

    从中国考试教育网下载的NetBeans中国考试教育版2007报错 E:\桌面\java考试\JavaApplication4\build.xml:7: Cannot find nbpr ...

  8. 第十七个知识点:描述和比较DES和AES的轮结构

    第十七个知识点:描述和比较DES和AES的轮结构 这是密码学52件事中的第17篇.本周我们描述和比较DES和AES的结构. DES和AES都是迭代分组密码的例子.分组密码通过重复使用一个简单的轮函数来 ...

  9. A Simple Framework for Contrastive Learning of Visual Representations

    目录 概 主要内容 流程 projection head g constractive loss augmentation other 代码 Chen T., Kornblith S., Norouz ...

  10. MATLAB 错误之生成step图表出错

    m文件: step(Gi_close) hold on 错误示例: 使用step函数生成图表后,报错如下: Plots must be of the same type and size to be ...