github.com/go-board/x-go@v0.1.2-0.20220610024734-db1323f6cb15/xnet/xhttp/README.md (about) 1 # XHttp 2 增强了net/http包的能力,提供了中间件模式以及更简单的request工具。 3 4 [xrequest](./xrequest/README.md) http 请求包 5 6 ## Middleware 7 ```go 8 package xhttp 9 10 type Middleware interface { 11 Next(h http.Handler) http.Handler 12 } 13 14 type MiddlewareFn func(h http.Handler) http.Handler 15 16 func (fn MiddlewareFn) Next(h http.Handler) http.Handler { return fn(h) } 17 ``` 18 `Middleware` 是服务端处理http请求的中间件,我们可以使用该接口来对http处理做一些额外的Hook,比如打日志,压缩response,路由中转等操作。 19 20 一个简单的日志中间件如下: 21 ```go 22 func logHandler(w io.StringWriter) Middleware { 23 return MiddlewareFn(func(h http.Handler) http.Handler { 24 return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { 25 now := time.Now() 26 h.ServeHTTP(writer, request) 27 w.WriteString(fmt.Sprintf("request method: %s, path: %s, latency: %s\n", request.Method, request.URL.Path, time.Since(now))) 28 }) 29 }) 30 } 31 ``` 32 我们在请求处理前记录下当前时间,在请求后记录下当前时间,然后做减法可以得到请求的耗时,最后进行记录。 33 34 ## Headers 35 HTTP协议中定义了大量的Header Key,这里罗列了大量的通用Header Key用来简化应用开发。 36 37 ## Method 与 Status 38 默认的Method和Status均为字符串,少了很多有用的特性,在这里,我们对他们进行了重定义,并且赋予了他们很多新的方法。 39 40 ```go 41 package xhttp 42 type Method string 43 44 const ( 45 MethodConnect Method = "CONNECT" 46 MethodDelete = "DELETE" 47 MethodGet = "GET" 48 MethodHead = "HEAD" 49 MethodOptions = "OPTIONS" 50 MethodPatch = "PATCH" 51 MethodPost = "POST" 52 MethodPut = "PUT" 53 MethodTrace = "TRACE" 54 ) 55 56 type Status struct { 57 code int 58 msg string 59 } 60 61 // NewStatus create new status 62 func NewStatus(code int, msg string) *Status { 63 return &Status{ 64 code: code, 65 msg: msg, 66 } 67 } 68 ``` 69 70 ### func (m Method) HasRequestBody() bool 71 72 是否可以有Request Body 73 74 ### func (m Method) HasResponseBody() bool 75 76 是否可以用Response Body 77 78 ### func (m Method) Safe() bool 79 80 是否安全 81 82 ### func (m Method) IsIdempotent() bool 83 84 是否幂等 85 86 ### func (m Method) Cacheable() bool 87 88 是否可以被缓存 89 90 ### func (s *Status) Code() int 91 获取Status Code 92 93 ### func (s *Status) Msg() string 94 获取Status Msg 95 96 ### func (s *Status) IsOk() bool 97 是否是正确状态 98 99 ### func (s *Status) IsClientError() bool 100 是否为客户端错误 101 102 ### func (s *Status) IsServerError() bool 103 是否为服务端错误