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 サイトの他の関連記事を参照してください。