在 go 中停止处理 http 请求

Luc*_*a R 2 rest go

我正在尝试在 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

curl --url http://127.0.0.1:8080/ping/abc
Run Code Online (Sandbox Code Playgroud)

Adr*_*ian 5

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

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")
}
Run Code Online (Sandbox Code Playgroud)

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

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")
}
Run Code Online (Sandbox Code Playgroud)

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