在 Go Chi 中间件处理程序中重用 HTTP 请求体
在 Go 中,当使用 go-chi HTTP 路由器时,你可能会遇到一种情况您需要在多个中间件处理程序中重用请求正文。以下代码片段说明了出现此问题的场景:
func Registration(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // if you delete this line, the user will be created // ...other code // if all good then create new user user.Create(w, r) } ... func Create(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // ...other code // ... there I get the problem with parse JSON from &b }
注册处理程序尝试读取请求正文并处理它。但是,在此步骤之后,当调用 Create 处理程序时,由于请求正文为空,因此无法解析请求正文中的 JSON。发生这种情况是因为外部处理程序将请求正文读取到末尾,而没有为内部处理程序留下任何可读取的内容。
要解决此问题,必须通过恢复外部处理程序中先前读取的数据来恢复请求正文。以下代码片段演示了如何实现此目的:
func Registration(w http.ResponseWriter, r *http.Request) { b, err := io.ReadAll(r.Body) // ...other code r.Body = io.NopCloser(bytes.NewReader(b)) user.Create(w, r) }
在此代码中,bytes.NewReader 函数在字节切片上返回 io.Reader。 io.NopCloser 函数又将 io.Reader 转换为 r.Body 所需的 io.ReadCloser。通过恢复请求正文,后续处理程序可以按预期访问和处理其内容。
以上是如何在 Go Chi 中间件处理程序中重用 HTTP 请求主体?的详细内容。更多信息请关注PHP中文网其他相关文章!