首页 >后端开发 >Golang >如何跨 Go-chi 中间件处理程序重用 HTTP 请求正文数据?

如何跨 Go-chi 中间件处理程序重用 HTTP 请求正文数据?

Barbara Streisand
Barbara Streisand原创
2024-12-08 15:24:12281浏览

How to Reuse HTTP Request Body Data Across Go-chi Middleware Handlers?

在 Go-chi 中间件处理程序中重用 HTTP 请求体

当使用 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
}

在此示例中,注册和创建处理程序都尝试读取使用 ioutil.ReadAll 的请求正文。但是,由于 Registration 会读取正文到末尾,因此在调用 Create 时没有剩余数据可供读取。

要解决此问题,外部处理程序(Registration)必须使用之前读取的数据恢复请求正文。这可以使用以下代码来实现:

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 需要 ReadCloser 接口。通过使用原始数据重置 r.Body,Create 现在可以按预期访问和解析请求正文。

以上是如何跨 Go-chi 中间件处理程序重用 HTTP 请求正文数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

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