Go 多次阅读一个阅读器
我有两个http处理程序,它们使用相同的http.ResponseWriter和*http.Request,并按如下方式读取请求正文: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
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服务器自动完成的,但您当然可以使用无操作关闭器来交换它。