Rumah >pembangunan bahagian belakang >Golang >Mengapa pengendali fungsi Go HTTP saya dipanggil dua kali?

Mengapa pengendali fungsi Go HTTP saya dipanggil dua kali?

Patricia Arquette
Patricia Arquetteasal
2024-12-15 09:27:14512semak imbas

Why is my Go HTTP function handler called twice?

Pengendali Fungsi HTTP Dipanggil Tanpa Jangka

Apabila menggunakan pengendali HTTP dalam Go, adalah penting untuk memahami cara permintaan diproses. Dalam senario biasa, penyemak imbas bukan sahaja membuat permintaan kepada URL akar tetapi juga meminta fail ikon bernama "/favicon.ico" untuk tujuan visual. Permintaan tambahan ini boleh menyebabkan fungsi pengendali dipanggil dua kali.

Contoh:

Pertimbangkan kod berikut yang menambah pembilang pada setiap lawatan halaman:

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)
}

Pemerhatian:

Jika anda mengakses port 8000 dalam pelayar web, anda akan perasan bahawa pengendali "hello" dipanggil dua kali. Ini kerana penyemak imbas juga membuat permintaan untuk "/favicon.ico." Jika anda menggunakan cURL untuk mengakses URL yang sama, pengendali hanya dipanggil sekali.

Untuk memahami dan menyelesaikan isu ini, hanya log permintaan. Anda akan melihat bahawa permintaan kedua adalah untuk "/favicon.ico." Untuk mengelakkan perkara ini, anda boleh sama ada:

  • Buat pengendali khusus untuk "/favicon.ico" dan sediakan ikon pemegang tempat atau favicon.
  • Konfigurasikan pelayan HTTP anda untuk mengabaikan "/ favicon.ico".

Memahami aliran permintaan HTTP dan mempertimbangkan kes kelebihan tertentu akan membantu anda menulis pelayan web yang mantap dan boleh dipercayai dengan Go.

Atas ialah kandungan terperinci Mengapa pengendali fungsi Go HTTP saya dipanggil dua kali?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn