Maison > développement back-end > Golang > Comment gérer et terminer gracieusement les requêtes HTTP dans Go ?

Comment gérer et terminer gracieusement les requêtes HTTP dans Go ?

Mary-Kate Olsen
Libérer: 2024-12-01 14:28:10
original
118 Les gens l'ont consulté

How to Gracefully Handle and Terminate HTTP Requests in Go?

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
})
Copier après la connexion

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
})
Copier après la connexion

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
})
Copier après la connexion

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
})
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal