Terminer ou abandonner une requête HTTP
Pour gérer les erreurs lors du traitement de l'API, il est crucial de mettre fin ou d'abandonner la requête. Bien que des options telles que log.fatal et os.Exit puissent mettre fin à l'intégralité du service, elles entravent la transmission des messages d'erreur. Cet article explore des approches alternatives utilisant panic, defer, recovery et return.
Gestion des erreurs avec return
La méthode la plus simple consiste à revenir à partir de la fonction 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 })
Cette approche fonctionne bien pour la fonction principale du gestionnaire HTTP, mais dans les fonctions imbriquées, il n'existe que la fonction, pas le appelant.
Codes d'erreur HTTP et réponses personnalisées
Au lieu du code de réponse par défaut 200 OK, envisagez de renvoyer un code d'erreur HTTP approprié. http.Error() permet des messages d'erreur personnalisés :
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if !ok { http.Error(w, `Invalid Input Parameters!`, http.StatusBadRequest) return } // Normal API handling })
Pour un contrôle plus granulaire, vous pouvez définir un type de contenu et un corps de réponse personnalisés :
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 })
Propagation des erreurs avec defer et recovery
Si la détection d'erreur se produit en dehors de ServeHTTP(), defer et recovery peuvent être utilisés pour propager l'état d'erreur au gestionnaire principal :
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 })
Dans cette approche, defer enregistre une fonction de nettoyage qui garantit que la fonction recovery() sera exécutée quel que soit le retour ou la panique de la fonction. Si decodeParams détecte un paramètre non valide, il panique, renvoyant effectivement une erreur de ServeHTTP() et lui permettant de renvoyer le message d'erreur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!