在上一节文章 go 应用 net/http 创立 web 服务器 - 高阶篇
咱们学会了创立 服务器。
在个别的 C / S 架构中,在多个客户端与服务器进行通信时,咱们常常应用中间件,来进去一些,在业务逻辑之前的,客户端发送给服务器的数据验证。
一、什么是 http 中间件
在互联网的 http 通信中,如果多个客户端拜访服务器,咱们就会构建一个 client/server 客户端 / 服务器 架构来实现。
服务器用来承受客户端的申请,而后返回特定的资源或者数据给客户端。
中间件是客户端申请达到解决办法之前对其进行预处理的一些逻辑。
罕用的利用场景有:
- 客户端身份校验
- 用户鉴权
- 客户端对服务器提供的特定服务是否有拜访权限
- 验证用户 session,并放弃通信存活
- 客户端申请参数解密
- 客户端参数格式化
- 日志记录器,用于记录每个 REST API 拜访申请
- 跨域配置
- 返回数据格式化
- Header 设置
中间件原理
在 Go 语言中,中间件 Handler 是封装另一个 http.Handler 以对申请进行预处理或后续解决的 http.Handler。它介于 Go Web 服务器与理论的处理程序之间,因而被称为“中间件”。
原理剖析:
咱们先看一个最简略的一个 http 服务器
package main
import (
"fmt"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "Hello World")
}
func main() {http.HandleFunc("/index", index)
http.ListenAndServe(":8090", nil)
}
下面的示例代码就实现了一个 http 服务器。
在路由的解决方面,次要是 通过 http.HandleFunc 函数,咱们能够看一下官网的源代码
// HandleFunc registers the handler function for the given pattern
// HandleFunc 注册 handler 处理函数到 DefaultServeMux,用来绑定给定的 url
// in the DefaultServeMux.
// The documentation for ServeMux explains how patterns are matched.
// ServeMux 文档有具体的 url 解析匹配介绍
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {DefaultServeMux.HandleFunc(pattern, handler)
}
// HandleFunc registers the handler function for the given pattern.
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
if handler == nil {panic("http: nil handler")
}
mux.Handle(pattern, HandlerFunc(handler))
}
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)
// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {f(w, r)
}
咱们能够看到最初的解决是通过 HandlerFunc 反射。
这个正是咱们传过来的 index(w http.ResponseWriter, r *http.Request)