首頁 > 後端開發 > Golang > 如何在 Go 中優雅地處理和終止 HTTP 請求?

如何在 Go 中優雅地處理和終止 HTTP 請求?

Mary-Kate Olsen
發布: 2024-12-01 14:28:10
原創
107 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板