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
Lepaskan: 2024-12-15 09:27:14
asal
507 orang telah melayarinya

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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan