首页 >后端开发 >Golang >如何在Go-chi中间件中重用HTTP请求体?

如何在Go-chi中间件中重用HTTP请求体?

Barbara Streisand
Barbara Streisand原创
2024-12-04 16:54:15450浏览

How Can I Reuse HTTP Request Bodies in Go-chi Middleware?

Go-chi 中间件中 HTTP 请求正文的可重用性

使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn