http.ServeMuxHTTP协议全称超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它详细规定了浏览器和WWW服务器之间通信的规则 , 通过Internet传送WWW文档的数据传送协议 。
Web服务是HTTP协议的一个服务 , HTTP协议承载在TCP协议之上 。Web服务工作流程
基于HTTP构建的服务标准模型包括客户端和服务端,HTTP请求从客户端发出,服务端接收到请求后进行处理 , 然后将响应返回给客户端 。
HTTP服务端核心工作是如何接收来自客户端的请求,并向客户端返回响应 。当HTTP服务器接收到客户端请求时,首先会进入路由模块,路由又称为服务复用器(Multiplexer) , 路由的工作在于请求找到对应的处理器(Handler),处理器对接收到的请求进行对应处理后,构建响应并返回给客户端 。
Go语言通过引入 net/http 包来实现HTTP网络访问,并提供HTTP客户端和服务端的实现 。
创建HTTP服务需经过2个阶段
例如:创建HTTP服务
理解HTTP服务关键点在于路由器和处理器
服务复用器
处理器
http.ServeMux 内部使用一个 map 映射来保存所有处理器, http.muxEntry 是一个多路复用器入口实体 。
可以发现在 http.muxEntry 字段中存在着 http.Handler 接口类型的 h
虽然 http.ServeMux 也实现了 http.ServerHTTP() 算得上是一个 http.Handler ,但 http.ServeMux 的 http.ServeHTTP() 并非用来处理请求和响应,而是用来查找注册路由对应的处理器 。
当 http.ServeMux 路由器设置路由规则后,会通过它实现的 ServeHTTP() 完成请求的分发 。当路由器接收到请求后若请求的URI为 * 则会关闭连接,否则会调用自身的 Handler() 来获取对应路由的处理器 , 最终通过调用 h.ServeHTTP(w,r) 实现对应路由的实现逻辑 。
路由器会根据用户请求的URL路径去匹配自身存储的在 map 中的 handler ,最终调用匹配到的 handler 的 ServeHTTP() 以实现执行对应路由的处理函数 。
创建 http.ServeMux 实例的方式有两种
http.DefaultServeMux 是默认的 http.ServeMux , 会随着 net/http 包初始化而被自动初始化 。
当 http.ListenAndServe() 在没有提供其他处理器的情况下,即它的入参 handler 为 nil 时内部会使用 http.DefaultServeMux。
net/http 包提供了一组快捷的注册路由的函数 http.Handle() 、 http.HandleFunc() 来配置 http.DefaultServeMux,快捷函数会将处理器注册到 http.DefaultServeMux。
二者之间的区别在于 handler 参数上
http.Handle() 的 handler 是一个 http.Handler 接口实例,也就是说传入的 handler 必须要自己提前实现 http.Handler 接口的 ServerHTTP(ResponseWriter, *Request) 方法 。
例如:将处理器放入闭包中,将参数传入处理器 。
http.HandleFunc() 的 handler 直接是一个原型为 func(ResponseWriter, *Request) 的函数,深入追踪会 HandleFunc() 会发现一个自定义的函数类型 。
因此任何具有 func(ResponseWriter, *Request) 签名的函数都能转换成为一个 http.HandlerFunc 类型的对象 。同时自定义的函数类型中已经实现了 ServeHTTP() 方法 , 因此它也是一个 http.Handler。
例如:返回时使用一个到 http.HandlerFunc 类型的隐式转换
net/http 包提供了 http.NewServeMux() 来创建一个自定义的 http.ServeMux 实例
例如:调用 http.NewServeMux() 会创建服务复用器
例如:创建静态服务
Go中没有继承、多态,可通过接口来实现 。而接口则是定义声明的函数签名,任何结构体只要实现与接口函数签名相同的方法,即等同于实现了对应的接口 。
例如: http.HandleFunc() 处理函数实现实际上调用默认 http.DefaultServeMux 的 HandleFunc() 方法
推荐阅读
- 软路由配什么cpu,软路由配什么网卡
- 雪花啤酒如何营销,雪花啤酒营销策划
- 视频号直播卖货选什么类目,视频号直播卖货选什么类目的
- c语言位移函数头文件 c语言中位移运算符
- 平板电脑怎么给u盘传东西,平板怎么传到u盘
- gis如何在属性表里添加字段,arcgis在属性表里添加字段
- mysql查询值为空的数据类型,mysql 查询空值
- 成都go语言的薪资如何 go语言工资高吗
- 区块链线路图解读,区块链线路图解读pdf