Menamatkan atau Menggugurkan Permintaan HTTP
Untuk menangani ralat semasa pengendalian API, adalah penting untuk menamatkan atau membatalkan permintaan itu. Walaupun pilihan seperti log.fatal dan os.Exit boleh menamatkan keseluruhan perkhidmatan, ia menghalang penghantaran mesej ralat. Artikel ini meneroka pendekatan alternatif menggunakan panik, tangguh, pulih dan kembali.
Pengendalian Ralat dengan pemulangan
Kaedah paling mudah adalah untuk kembali daripada fungsi 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 })
Pendekatan ini berfungsi dengan baik untuk fungsi pengendali HTTP utama, tetapi dalam fungsi bersarang, ia hanya wujud fungsi, bukan pemanggil.
Kod Ralat HTTP dan Respons Tersuai
Daripada kod respons 200 OK lalai, pertimbangkan untuk mengembalikan kod ralat HTTP yang sesuai. http.Error() membenarkan mesej ralat tersuai:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if !ok { http.Error(w, `Invalid Input Parameters!`, http.StatusBadRequest) return } // Normal API handling })
Untuk kawalan yang lebih terperinci, anda boleh menetapkan jenis kandungan tersuai dan badan respons:
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 })
Penyebaran Ralat dengan menangguhkan dan pulih
Jika pengesanan ralat berlaku di luar ServeHTTP(), tangguh dan pulih boleh digunakan untuk menyebarkan keadaan ralat kepada pengendali utama:
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 })
Dalam pendekatan ini, tangguh mendaftarkan fungsi pembersihan yang memastikan fungsi recover() akan dilaksanakan tanpa mengira pemulangan atau panik fungsi. Jika decodeParams mengesan parameter yang tidak sah, ia panik, dengan berkesan mengembalikan ralat daripada ServeHTTP() dan membenarkannya mengembalikan mesej ralat.
Atas ialah kandungan terperinci Bagaimana Mengendalikan dan Menamatkan Permintaan HTTP dengan Anggun dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!