我使用 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
}
user.Create 返回错误 "unexpected end of JSON input"
实际上,在我执行 ioutil.ReadAll 之后user.Create 停止解析 JSON,
r.Body 中有一个空数组 [] 我该如何解决这个问题?

最佳答案

外部处理程序将请求正文读取到 EOF。当内部处理程序被调用时,没有什么可以从主体中读取的了。

要解决此问题,请使用先前在外部处理程序中读取的数据恢复请求正文:

func Registration(w http.ResponseWriter, r *http.Request) {
    b, err := ioutil.ReadAll(r.Body)
    // ...other code
    r.Body = ioutil.NopCloser(bytes.NewReader(b))
    user.Create(w, r)
}

函数 bytes.NewReader() 返回一个字节 slice 上的 io.Reader。函数 ioutil.NopCloserio.Reader 转换为 io.ReadCloser 所需的 r.Body

关于http - 如何在 HTTP 中间件处理程序之间重用 *http.Request 的请求正文?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47625304/

10-16 21:09