为了账号安全,请及时绑定邮箱和手机立即绑定

go中停止处理http请求

go中停止处理http请求

Go
胡子哥哥 2023-07-17 17:08:04
我正在尝试在 golang 中重写一个小的node-api,在那里我发现内部错误并没有停止请求的处理。有没有好的方法来结束处理?我尝试过不同的方法,例如创建错误对象并使用panic(err)退出处理,但我认为还有更好的方法。我期望有一个函数能够停止请求的处理并抛出 500 错误,并且可能会记录一两件事。代码示例如下:package mainimport (    "fmt"    "net/http"    "strings")func main() {    http.HandleFunc("/ping/", ping)    err := http.ListenAndServe(":8080", nil)    checkErr(err)}func ping(w http.ResponseWriter, req *http.Request) {    w.Write([]byte("pong\n"))    urlPath := req.URL.Path    rest := strings.TrimPrefix(urlPath, "/ping/")    testRest(w, rest)}func testRest(w http.ResponseWriter, rest string) {    if rest == "abc" {        http.Error(w, "The go-routine should stop here", 500)    }    fmt.Print("This shouldn't be printed")}func checkErr(err error) {    if err != nil {        panic(err)    }}我这样称呼它:curl --url http://127.0.0.1:8080/ping/abc
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

这没有什么窍门。当您希望处理函数停止执行操作时,只需从函数返回即可:


func testRest(w http.ResponseWriter, rest string) {

    if rest == "abc" {

        http.Error(w, "The go-routine should stop here", 500)

        return

    }

    fmt.Print("This shouldn't be printed")

}

如果你想记录一些东西,记录一些东西:


func testRest(w http.ResponseWriter, rest string) {

    if rest == "abc" {

        http.Error(w, "The go-routine should stop here", 500)

        log.Println("something bad happened")

        return

    }

    fmt.Print("This shouldn't be printed")

}

这里的所有都是它的。当你说“内部错误不会停止请求的处理”时,你似乎认为发生了更多的魔法,但在 Go 中却很少有魔法。http.Error将错误响应写回客户端。就这样。它没有办法“阻止”任何事情;它只是将状态代码和正文写入客户端连接,然后返回。返回后,您有机会在调用代码中执行更多操作,但如果您只想返回函数,则只需返回即可。从处理程序返回是“停止处理请求” - 您的代码正在处理请求,您拥有完全的控制权。


查看完整回答
反对 回复 2023-07-17
?
ITMISS

TA贡献1871条经验 获得超8个赞

重要的是要记住,这只是针对客户请求的解决方案。如果您想取消来自服务器的请求,可能需要采用不同的方法。


查看完整回答
反对 回复 2023-07-17
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信