首页 >后端开发 >Golang >如何在 Go Chi 中间件处理程序中重用 HTTP 请求主体?

如何在 Go Chi 中间件处理程序中重用 HTTP 请求主体?

Barbara Streisand
Barbara Streisand原创
2024-12-05 02:58:08688浏览

How to Reuse HTTP Request Bodies in Go Chi Middleware Handlers?

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

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