使用 Go-chi 进行 HTTP 路由时,通常需要在多个处理程序中重用请求正文。然而,当请求正文只能读取一次时,就会出现一个常见的挑战。
例如,考虑以下代码:
func Registration(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // read request body // ...other code user.Create(w, r) } ... func Create(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // ...other code }
在此示例中,注册处理程序读取请求正文使用 ioutil.ReadAll。当调用 Create 处理程序时,它会尝试重新读取正文,从而导致 JSON 输入错误的意外结束。
这里的根本问题是第一次调用 ReadAll 会耗尽请求正文。要解决此问题,必须使用之前读取的数据来恢复请求正文。下面的代码演示了如何实现:
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) }
在修改后的代码中,使用 io.ReadAll 读取请求正文,然后在调用之前使用 bytes.NewReader 和 io.NopCloser 函数恢复请求正文用户.创建.这有效地使请求正文可供后续处理程序使用。
以上是如何在Go-chi中间件中重用HTTP请求体?的详细内容。更多信息请关注PHP中文网其他相关文章!