广告
返回顶部
首页 > 资讯 > 后端开发 > GO >怎么在Golang中实现一个简单的Http中间件
  • 218
分享到

怎么在Golang中实现一个简单的Http中间件

2023-06-20 17:06:09 218人浏览 独家记忆
摘要

本篇内容主要讲解“怎么在golang中实现一个简单的Http中间件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Golang中实现一个简单的Http中间件”吧!本文主要针对Golang的内

本篇内容主要讲解“怎么在golang中实现一个简单的Http中间件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Golang中实现一个简单的Http中间件”吧!

本文主要针对Golang的内置库 net/http 做了简单的扩展,通过添加中间件的形式实现了管道(Pipeline)模式,这样的好处是各模块之间是低耦合的,符合单一职责原则,可以很灵活的通过中间件的形式添加一些功能到管道中,一次请求和响应在管道中的执行过程如下

怎么在Golang中实现一个简单的Http中间件

首先, 我定义了三个测试的中间件 Middleware1,2,3 如下

func Middleware1(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {fmt.Println("M1 in")next.ServeHTTP(w, r)fmt.Println("M1 out")})}func Middleware2(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {fmt.Println("M2 in")next.ServeHTTP(w, r)fmt.Println("M2 out")})}func Middleware3(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {fmt.Println("M3 in")next.ServeHTTP(w, r)fmt.Println("M3 out")})}

这里中间件的入参和出参的类型都是 http.Handler, 然后在 next.ServeHTTP() 的前后分别输出了 In 和 Out.

接下来,定义一个 Pipeline 的方法,里面使用嵌套的形式, 使用了上面定义的三个测试的中间件.

func Pipeline(next http.Handler) http.Handler {return Middleware1(Middleware2(Middleware3(next)))}

然后还需要业务代码,这里我定义了 LoginHandler 和 ReGISterHandler 两个方法

func LoginHandler(w http.ResponseWriter, r *http.Request) {fmt.Println("Login...")w.Write([]byte("Login..."))}func RegisterHandler(w http.ResponseWriter, r *http.Request) {fmt.Println("Register...")w.Write([]byte("Register..."))}

最后修改程序的 main 函数, 在 Login 接口上使用上面添加过中间件的 Pipeline

func main() {http.Handle("/Login", Pipeline(http.HandlerFunc(LoginHandler)))http.Handle("/Register", http.HandlerFunc(RegisterHandler))http.ListenAndServe(":8080", nil)}

启动程序后,访问 http://localhost:8080/Login, 程序的输出如下,这和本文最上面的管道的流程图是一致的,然后访问 Register 接口, 控制台没有输出信息,当然也不会执行任何中间件。

怎么在Golang中实现一个简单的Http中间件

现在已经实现了中间件的机制,但是,上面添加中间件是用嵌套的方法,这种方式不能说不太优雅,只能说非常的Low,接下来我们需要对管道进行优化

type Chain struct {middlewares []func(handler http.Handler) http.Handler}func Pipeline(next http.Handler) http.Handler {//return Middleware1(Middleware2(Middleware3(next)))return AddMiddlewares(Middleware1,Middleware2,Middleware3).Then(next)} func AddMiddlewares(m ...func(handlerFunc http.Handler) http.Handler) Chain {c := Chain{}c.middlewares = append(c.middlewares,m...)return c}func (c Chain) Then(next http.Handler) http.Handler {for i := range c.middlewares {prev := c.middlewares[len(c.middlewares)-1-i]next = prev(next)}return next}

首先定义了一个Chain 的struct,用来接收添加到管道中的中间件,在 AddMiddlewares() 函数中,接收了多个Handle, 然后组装到 Chain 对象并返回, 接下来调用 Then() 函数, 把管道中的中间件和业务的Handler 关联起来。在中间件的使用方式上, 这两种方法都是一样的,只需要调用 Pipeline() 方法就行了。

本文在go WEB中简单的实现了中间件的机制,这样带来的好处也是显而易见的,当然社区也有一些成熟的 middleware 组件,包括 Gin 一些Web框架中也包含了 middleware 相关的功能, 希望对您有用.

到此,相信大家对“怎么在Golang中实现一个简单的Http中间件”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: 怎么在Golang中实现一个简单的Http中间件

本文链接: https://www.lsjlt.com/news/298984.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Golang中实现一个简单的Http中间件
    本篇内容主要讲解“怎么在Golang中实现一个简单的Http中间件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Golang中实现一个简单的Http中间件”吧!本文主要针对Golang的内...
    99+
    2023-06-20
  • 在 Golang 中实现一个简单的Http中间件过程详解
    本文主要针对Golang的内置库 net/http 做了简单的扩展,通过添加中间件的形式实现了管道(Pipeline)模式,这样的好处是各模块之间是低耦合的,符合单一职责原则,可以很...
    99+
    2022-11-12
  • Golang中实现简单的Http Middleware
    本文主要针对Golang的内置库 net/http 做了简单的扩展,通过添加中间件的形式实现了管道(Pipeline)模式,这样的好处是各模块之间是低耦合的,符合单一职责原则,可以很...
    99+
    2022-11-12
  • 浅析node中间件及实现一个简单的node中间件
    目录一、是什么二、封装token校验日志模块koa-bodyparserkoa-static三、总结一、是什么 中间件(Middleware)是介于应用系统和系统软件之间的一类软件,...
    99+
    2022-11-13
  • Golang中怎么实现一个HTTP代理服务器
    本篇文章给大家分享的是有关Golang中怎么实现一个HTTP代理服务器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。定义请求对象,接收客户端请求处理请求,把处理结果返回给客户端...
    99+
    2023-06-03
  • Android中怎么实现一个简易时间轴
    这期内容当中小编将会给大家带来有关Android中怎么实现一个简易时间轴,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。新建一个自定义控件:public class WorkExcVie...
    99+
    2023-05-30
    android
  • 怎么在Java项目中实现一个简单工厂模式
    今天就跟大家聊聊有关怎么在Java项目中实现一个简单工厂模式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。简单工厂模式解释:     ...
    99+
    2023-05-31
    简单工厂模式 java ava
  • Android怎么实现一个简单的单词本
    这篇文章主要介绍了Android怎么实现一个简单的单词本的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么实现一个简单的单词本文章都会有所收获,下面我们一起来看看吧。本文基于Java实现了一个简单...
    99+
    2023-06-29
  • Python中怎么实现一个简单遗传算法
    今天就跟大家聊聊有关Python中怎么实现一个简单遗传算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。遗传算法遗传算法是模仿自然选择过程的优化算法。 他们没有使用"数学技...
    99+
    2023-06-16
  • Vue中怎么实现一个单文件组件
    这期内容当中小编将会给大家带来有关Vue中怎么实现一个单文件组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。背景相信大家在使用Vue开发项目时,基本都是以单文件组件的形...
    99+
    2022-10-19
  • Vuejs中怎么实现一个单文件组件
    Vuejs中怎么实现一个单文件组件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。初识单文件组件还是利用工欲善其事必先利其器 中的源码,在 ...
    99+
    2022-10-19
  • VB.NET中怎么实现一个菜单组件
    VB.NET中怎么实现一个菜单组件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Windows应用程序中往往离不开菜单,菜单的应用是十分普遍了,并且菜单的设计是十分简单的,这主...
    99+
    2023-06-17
  • golang消息中间件怎么实现
    在 Golang 中,可以使用多种消息中间件来实现消息传递和处理。以下是几种常见的消息中间件实现方式: Redis:Redis ...
    99+
    2023-10-27
    golang
  • 怎么在html5中实现一个BUI折叠菜单插件
    本篇文章为大家展示了怎么在html5中实现一个BUI折叠菜单插件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一个点击显示隐藏的效果, 并且点击的时候, 会先把展开进行隐藏, 再展开自己的. 从界面...
    99+
    2023-06-09
  • Python中怎么实现一个HTTP服务
    Python中怎么实现一个HTTP服务,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实际上来说,这是一个可以用来共享文件的非常有用的方式。实现一个微型的HTTP...
    99+
    2023-06-17
  • nodejs中怎么实现一个http请求
    nodejs中怎么实现一个http请求,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。nodejs http请求相关总结通过no...
    99+
    2022-10-19
  • 如何在Python中实现一个简单的爬虫程序
    如何在Python中实现一个简单的爬虫程序随着互联网的发展,数据已成为当今社会最宝贵的资源之一。而爬虫程序则成为了获取互联网数据的重要工具之一。本文将介绍如何在Python中实现一个简单的爬虫程序,并提供具体的代码示例。确定目标网站在开始编...
    99+
    2023-10-22
    Python 程序 爬虫
  • Golang中怎么实现一个工作池
    本篇文章为大家展示了Golang中怎么实现一个工作池,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。worker pool简介worker pool其实就是线程池th...
    99+
    2022-10-18
  • CSS怎么实现一个简单的Loading效果
    在前端开发中,Loading是一个非常常见的功能。当网页数据加载时,我们希望能够在用户等待的同时,给其一个视觉上的反馈,来增强用户体验。在这篇文章中,我们将通过CSS来实现一个简单的Loading效果。1.使用Animation动画实现Lo...
    99+
    2023-05-14
  • C++怎么实现一个简单的线程池
    本文小编为大家详细介绍“C++怎么实现一个简单的线程池”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现一个简单的线程池”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、设计线程池应该包括保存线程的容...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作