Go 多次阅读一个阅读器

Go 多次阅读一个阅读器,go,Go,我有两个http处理程序,它们使用相同的http.ResponseWriter和*http.Request,并按如下方式读取请求正文: func Method1 (w http.ResponseWriter, r *http.Request){ var postData database.User if err := json.NewDecoder(r.Body).Decode(&postData); err != nil { //return error

我有两个http处理程序,它们使用相同的http.ResponseWriter和*http.Request,并按如下方式读取请求正文:

func Method1 (w http.ResponseWriter, r *http.Request){
    var postData database.User
    if err := json.NewDecoder(r.Body).Decode(&postData); err != nil {
      //return error
    }
}

func Method2 (w http.ResponseWriter, r *http.Request){
    var postData database.User
    //this read gives (of course) EOF error
    if err := json.NewDecoder(r.Body).Decode(&postData); err != nil {
      //return error
    }
}

因为我需要将这两个方法分开,并且它们都需要读取请求正文,这是寻找请求正文的最佳方式(如果可能的话)(这是ReadCloser,而不是Seeker?)。

实际上,多亏了miku,我发现最好的解决方案是使用TeeReader,以这种方式更改方法1

func Method1 (w http.ResponseWriter, r *http.Request){
    b := bytes.NewBuffer(make([]byte, 0))
    reader := io.TeeReader(r.Body, b)

    var postData MyStruct
    if err := json.NewDecoder(reader).Decode(&postData); err != nil {
        //return an error
    }

    r.Body = ioutil.NopCloser(b)
}

相关:,基本上是:使用。谢谢,我添加了一个示例代码作为答案,希望这对其他用户有用。我冒昧地写了一个:。请注意,您需要关闭阅读器。这通常是由http服务器自动完成的,但您当然可以使用无操作关闭器来交换它。