Memperbaiki Pengendalian Pengesahan untuk Pertanyaan HTTP dalam Go
Masalah:
Pertimbangkan kod berikut untuk melaksanakan permintaan HTTP dengan pengesahan:
client := &http.Client{} // Authenticate req, err := http.NewRequest("GET", "http://164.99.113.32/Authenticate", nil) req.SetBasicAuth("<username>", "<password>") resp, err := client.Do(req) if err != nil { fmt.Printf("Error : %s", err) } // Get Details req.URL, _ = url.Parse("http://164.99.113.32/Details") resp, err = client.Do(req) if err != nil { fmt.Printf("Error : %s", err) }
Selepas mengesahkan berjaya, permintaan seterusnya untuk '/Butiran' gagal dengan ralat 401 yang dinafikan akses, walaupun tiada isu pada bahagian pelayan.
Penyelesaian:
Untuk menyelesaikan masalah ini, adalah perlu untuk menggunakan balang kuki untuk mengurus maklumat sesi. Pelanggan HTTP Go tidak mengendalikan perkara ini secara lalai, jadi kami mesti menentukan pelaksanaan balang kuki tersuai kami:
type myjar struct { jar map[string] []*http.Cookie } func (p* myjar) SetCookies(u *url.URL, cookies []*http.Cookie) { fmt.Printf("The URL is : %s\n", u.String()) fmt.Printf("The cookie being set is : %s\n", cookies) p.jar [u.Host] = cookies } func (p *myjar) Cookies(u *url.URL) []*http.Cookie { fmt.Printf("The URL is : %s\n", u.String()) fmt.Printf("Cookie being returned is : %s\n", p.jar[u.Host]) return p.jar[u.Host] }
Dalam fungsi utama, mulakan balang kuki tersuai dan berikannya kepada klien HTTP:
jar := &myjar{} jar.jar = make(map[string] []*http.Cookie) client.Jar = jar
Dengan pelaksanaan ini, permintaan seterusnya boleh berjaya mengakses titik akhir '/Butiran'.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Kuki Pengesahan untuk Permintaan HTTP dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!