gpt4 book ai didi

go - 有没有一种方法可以在多个处理程序中使用相同的request.Body,而无需手动编写大量代码,或者我需要更改执行此操作的方式?

转载 作者:行者123 更新时间:2023-12-01 22:30:42 25 4
gpt4 key购买 nike

这里的这篇惊人的文章:https://www.alexedwards.net/blog/how-to-properly-parse-a-json-request-body很好地解释了如何编写Golang处理程序。
仅当第一个处理程序出错时,我才需要使用两个处理程序,一个接一个。
像这样:

func main() {
r := chi.NewRouter()

r.Post("/api", MyHandlers)
}

func MyHandlers(w http.ResponseWriter, r *http.Request) {

err := DoSomething(w, r)

if err != nil {
println("OMG! Error!")
DoSomethingWithThisOneInstead(w, r)
}

}

func DoSomething(w http.ResponseWriter, r *http.Request) error {
// here I need to read request's Body
// and I can use io.TeeReader()
// and I can use all the code in the amazing article example
// but I don't want to, because it's a lot of code to maintain
res, err := myLibrary.DoSomething(requestBody)
if err != nil {
return err
}
render.JSON(w, r, res) // go-chi "render" pkg
return nil
}

func DoSomethingWithThisOneInstead(w http.ResponseWriter, r *http.Request) {
// here I need to read request's Body again!
// and I can use all the code in the amazing article example
// but I don't want to, because it's a lot of code to maintain
anotherLibrary.DoSomethingElse.ServeHTTP(w, r)
}
  • 是否有其他方法可以代替读取两次或多次相同的request.Body
  • 是否有一种方法可以避免在文章中编写所有代码(需要维护),而避免使用开放源代码库来做得更好,并且比我的方法聪明得多,因此可以对其进行修改?
  • 例如:我可以使用 go-chi 方法吗?
  • 最佳答案

    吸收字节并根据需要使用:

    func MyHandlers(w http.ResponseWriter, r *http.Request) {
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
    // handle error
    }
    r.Body.Close()

    r.Body = ioutil.NopCloser(bytes.NewReader(body))
    err := DoSomething(w, r)

    if err != nil {
    println("OMG! Error!")
    r.Body = ioutil.NopCloser(bytes.NewReader(body))
    DoSomethingWithThisOneInstead(w, r)
    }

    }

    关于go - 有没有一种方法可以在多个处理程序中使用相同的request.Body,而无需手动编写大量代码,或者我需要更改执行此操作的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62705612/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com