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