Maison >développement back-end >Golang >Pourquoi mon gestionnaire de fonctions Go HTTP est-il appelé deux fois ?

Pourquoi mon gestionnaire de fonctions Go HTTP est-il appelé deux fois ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-15 09:27:14505parcourir

Why is my Go HTTP function handler called twice?

Gestionnaire de fonctions HTTP appelé de manière inattendue

Lors de l'utilisation de gestionnaires HTTP dans Go, il est crucial de comprendre comment les requêtes sont traitées. Dans un scénario courant, un navigateur envoie non seulement une requête à l'URL racine, mais demande également un fichier icône nommé "/favicon.ico" à des fins visuelles. Cette requête supplémentaire peut conduire à l'appel d'une fonction de gestionnaire deux fois.

Exemple :

Considérez le code suivant qui incrémente un compteur à chaque visite de page :

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
)

var counter int

func hello(w http.ResponseWriter, r *http.Request) {
    counter++
    io.WriteString(w, fmt.Sprintf("Hello world! Counter: %d", counter))
    log.Println("hello.")
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", hello)
    http.ListenAndServe(":8000", mux)
}

Observation :

Si vous accédez au port 8000 en un navigateur Web, vous remarquerez que le gestionnaire "hello" est appelé deux fois. En effet, le navigateur demande également "/favicon.ico". Si vous utilisez cURL pour accéder à la même URL, le gestionnaire n'est appelé qu'une seule fois.

Pour comprendre et résoudre ce problème, enregistrez simplement les requêtes. Vous verrez que la deuxième requête concerne "/favicon.ico". Pour éviter cela, vous pouvez soit :

  • Créer un gestionnaire spécifiquement pour "/favicon.ico" et servir une icône ou un favicon d'espace réservé.
  • Configurer votre serveur HTTP pour ignorer "/ favicon.ico".

Comprendre le flux de requêtes HTTP et prendre en compte les cas extrêmes spécifiques vous aidera à écrire des serveurs Web robustes et fiables avec Allez-y.

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!

Déclaration:
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