ホームページ > バックエンド開発 > Golang > Go で HTTP リクエストを適切に処理および終了するにはどうすればよいですか?

Go で HTTP リクエストを適切に処理および終了するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-01 14:28:10
オリジナル
186 人が閲覧しました

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 エラー コードとカスタム レスポンス

デフォルトの 200 OK レスポンス コードの代わりに、適切な HTTP エラー コードを返すことを検討してください。 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 と Recovery を使用

ServeHTTP() の外部でエラー検出が発生した場合は、defer と Recovery を使用できます。エラー状態をメイン ハンドラーに伝播します:

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
})
ログイン後にコピー

このアプローチでは、関数のリターンまたはパニックに関係なく、recover() 関数が確実に実行されるクリーンアップ関数を defer で登録します。 decodeParams が無効なパラメータを検出すると、パニックが発生し、実質的に ServeHTTP() からエラーを返し、エラー メッセージを返すことができるようになります。

以上がGo で HTTP リクエストを適切に処理および終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート