Rumah >pembangunan bahagian belakang >Golang >Mengapa HTTP POST Meminta Isyarat Pembatalan Konteks dalam Go?
Kehilangan Isyarat Pembatalan Konteks dalam Permintaan HTTP dengan Badan
Semasa membangunkan pelayan HTTP dalam Go, kebimbangan timbul: konteks.Selesai( ) saluran gagal menangkap isyarat putus sambungan pelanggan untuk permintaan dengan badan. Tingkah laku ini berbeza daripada permintaan GET, yang berjaya mengesan perlepasan pelanggan.
Punca Asas
Ketidakkonsistenan ini berpunca daripada fungsi pelayan net/http. Mekanisme semakan sambungannya bermula hanya apabila aplikasi membaca badan permintaan. Memandangkan permintaan GET tidak mempunyai badan, semakan sambungan dicetuskan serta-merta, membolehkan pelayan mengesan pembatalan pelanggan dengan segera. Walau bagaimanapun, untuk permintaan POST, pelayan menunggu sehingga kandungan dibaca sebelum memulakan semakan sambungan.
Penyelesaian
Untuk menyelesaikan isu ini, anda perlu membaca secara manual badan permintaan untuk merangsang proses semakan sambungan pelayan. Coretan kod berikut menunjukkan perkara ini:
func handler(w http.ResponseWriter, r *http.Request) { go func(done <-chan struct{}) { <-done fmt.Println("message", "client connection has gone away, request got cancelled") }(r.Context().Done()) io.Copy(ioutil.Discard, r.Body) // Read the body time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
Dengan membaca kandungan permintaan secara eksplisit, pelayan boleh mengesan pemutusan sambungan pelanggan dengan segera, walaupun untuk permintaan dengan badan. Ini membolehkan pembersihan yang betul dan keluaran sumber pada bahagian pelayan.
Atas ialah kandungan terperinci Mengapa HTTP POST Meminta Isyarat Pembatalan Konteks dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!