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  是否为服务端错误