go中停止处理http请求

我正在尝试在 golang 中重写一个小的node-api,在那里我发现内部错误并没有停止请求的处理。有没有好的方法来结束处理?


我尝试过不同的方法,例如创建错误对象并使用panic(err)退出处理,但我认为还有更好的方法。


我期望有一个函数能够停止请求的处理并抛出 500 错误,并且可能会记录一两件事。


代码示例如下:


package main


import (

    "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


胡子哥哥
浏览 148回答 2
2回答

肥皂起泡泡

这没有什么窍门。当您希望处理函数停止执行操作时,只需从函数返回即可: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将错误响应写回客户端。就这样。它没有办法“阻止”任何事情;它只是将状态代码和正文写入客户端连接,然后返回。返回后,您有机会在调用代码中执行更多操作,但如果您只想返回函数,则只需返回即可。从处理程序返回是“停止处理请求” - 您的代码正在处理请求,您拥有完全的控制权。

ITMISS

重要的是要记住,这只是针对客户请求的解决方案。如果您想取消来自服务器的请求,可能需要采用不同的方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go