首页 > 后端开发 > Golang > 如何在 Go 中优雅地处理和终止 HTTP 请求?

如何在 Go 中优雅地处理和终止 HTTP 请求?

Mary-Kate Olsen
发布: 2024-12-01 14:28:10
原创
193 人浏览过

How to Gracefully Handle and Terminate HTTP Requests in Go?

终止或中止 HTTP 请求

要处理 API 处理期间的错误,终止或中止请求至关重要。虽然像 log.fatal 和 os.Exit 这样的选项可能会终止整个服务,但它们会阻碍错误消息的传递。本文探讨了使用panic、defer、recover和return的替代方法。

使用return进行错误处理

最简单的方法是从ServeHTTP()函数返回:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // Check parameters
    if !ok {
        str := `{"Result":"","Error":"Invalid Parameters"}`
        fmt.Fprint(w, str)
        return // Terminates the request
    }

    // Normal API handling
})
登录后复制

这种方法对于主 HTTP 处理函数来说效果很好,但在嵌套函数中,它只存在函数,而不存在调用者。

HTTP 错误代码和自定义响应

考虑返回适当的 HTTP 错误代码,而不是默认的 200 OK 响应代码。 http.Error() 允许自定义错误消息:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    if !ok {
        http.Error(w, `Invalid Input Parameters!`, http.StatusBadRequest)
        return
    }

    // Normal API handling
})
登录后复制

要进行更精细的控制,您可以设置自定义内容类型和响应正文:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    if !ok {
        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(http.StatusBadRequest)
        str := `{"Result":"","Error":"Invalid Input Parameters"}`
        fmt.Fprint(w, str)
        return
    }

    // Normal API handling
})
登录后复制

错误传播使用defer和recover

如果错误检测发生在ServeHTTP()之外,则可以使用defer和recover来传播将错误状态传递给主处理程序:

type params struct {
    // Parameter fields
}

func decodeParams(r *http.Request) (*params, error) {
    p := new(params)
    defer func() {
        if r := recover(); r != nil {
            log.Println(r)
            return
        }
    }()
    // Parameter decoding
    if !ok {
        panic(errors.New("Invalid Parameters"))
    }

    return p, nil
}

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    p, err := decodeParams(r)
    if err != nil {
        http.Error(w, `Invalid Input Parameters!`, http.StatusBadRequest)
        return
    }

    // Normal API handling
})
登录后复制

在这种方法中,defer 注册了一个清理函数,以确保不管函数返回还是panic,recover() 函数都会被执行。如果decodeParams检测到无效参数,它会发生恐慌,有效地从ServeHTTP()返回错误并允许它返回错误消息。

以上是如何在 Go 中优雅地处理和终止 HTTP 请求?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板