Maison >développement back-end >Golang >Comment gérer les exceptions de fichier introuvable dans un serveur de fichiers statique Go pour les applications à page unique ?

Comment gérer les exceptions de fichier introuvable dans un serveur de fichiers statique Go pour les applications à page unique ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 02:32:02871parcourir

How to Handle File Not Found Exceptions in a Go Static File Server for Single-Page Applications?

Gestion de l'exception de fichier introuvable dans le serveur de fichiers statique Go

Dans une application Go, vous exploitez une application Web d'une seule page et servez ses actifs à l'aide d'un fichier statique serveur de fichiers. Bien que le serveur fonctionne bien pour servir les actifs existants dans le répertoire racine, il génère une erreur 404 Not Found si un fichier demandé n'est pas présent.

Votre objectif est de modifier le comportement du serveur pour servir index.html pour tout URL non reconnue. Ceci est crucial car votre application monopage gère le rendu basé sur le HTML et le JavaScript servis.

Personnalisation de la gestion des fichiers introuvables

Le gestionnaire par défaut fourni par http.FileServer() manque d'options de personnalisation, y compris la gestion de 404 réponses introuvables. Pour résoudre cette limitation, nous allons envelopper le gestionnaire et implémenter notre logique dans le wrapper.

Création d'un rédacteur de réponse HTTP personnalisé

Nous allons créer un http.ResponseWriter personnalisé qui encapsule l'original rédacteur de réponses. Cet rédacteur de réponses personnalisées :

  1. Inspecter l'état de la réponse, en particulier à la recherche d'un code d'état 404.
  2. Si un code d'état 404 est détecté, au lieu d'envoyer la réponse au client , nous enverrons une réponse de redirection 302 Found à /index.html.

Vous trouverez ci-dessous un exemple d'un tel rédacteur de réponse personnalisé :

<code class="go">type NotFoundRedirectRespWr struct {
    http.ResponseWriter // Embed the base HTTP response writer
    status              int
}

func (w *NotFoundRedirectRespWr) WriteHeader(status int) {
    w.status = status // Store the status code
    if status != http.StatusNotFound {
        w.ResponseWriter.WriteHeader(status) // Proceed normally for non-404 statuses
    }
}

func (w *NotFoundRedirectRespWr) Write(p []byte) (int, error) {
    if w.status != http.StatusNotFound {
        return w.ResponseWriter.Write(p) // Proceed normally for non-404 statuses
    }
    return len(p), nil // Pretend that the data was successfully written, but discard it
}</code>

Encapsulation du gestionnaire par défaut

Ensuite, nous encapsulons le gestionnaire renvoyé par http.FileServer(). Le gestionnaire du wrapper :

  1. Appellera le gestionnaire par défaut.
  2. Si le gestionnaire par défaut définit le code d'état 404 dans notre rédacteur de réponse personnalisé, ce wrapper interceptera la réponse.
  3. Au lieu d'envoyer la réponse 404, il redirigera la requête vers /index.html avec un statut 302 Found.

Voici un exemple du gestionnaire wrapper :

<code class="go">func wrapHandler(h http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        nfrw := &NotFoundRedirectRespWr{ResponseWriter: w}
        h.ServeHTTP(nfrw, r) // Call the default handler with our custom response writer
        if nfrw.status == 404 {
            log.Printf("Redirecting %s to index.html.", r.RequestURI)
            http.Redirect(w, r, "/index.html", http.StatusFound)
        }
    }
}</code>

Rassembler le tout

Maintenant, dans votre fonction main(), utilisez le gestionnaire wrapper pour modifier le comportement du serveur de fichiers statiques.

<code class="go">func main() {
    fs := wrapHandler(http.FileServer(http.Dir("."))) // Wrap the handler
    http.HandleFunc("/", fs)
    panic(http.ListenAndServe(":8080", nil)) // Start serving files with the custom handler
}</code>

Avec cette approche, tous les requêtes vers des URL correspondant à des fichiers inexistants déclencheront une redirection vers index.html. Votre application monopage fonctionnera comme prévu, affichant le contenu approprié en fonction du HTML et du JavaScript servis.

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