Apabila menggunakan golang untuk permintaan http, jika pelayan mengembalikan respons yang dikodkan ketulan, anda perlu memberi perhatian untuk mematikan pengekodan bongkah apabila membaca badan respons, jika tidak, data yang tidak lengkap akan dibaca.
Pengekodan bongkah ialah kaedah penghantaran yang membahagikan data kepada beberapa ketulan dan menghantarnya Setiap ketulan mengandungi panjang ketulan data. Selepas semua blok telah dihantar, blok panjang 0 dihantar untuk menunjukkan akhir penghantaran.
Dalam golang, perpustakaan yang biasa digunakan turut menyokong respons http yang dikodkan secara berpotongan. Sebagai contoh, apabila menghantar permintaan menggunakan pakej http perpustakaan standard, jika pelayan mengembalikan respons yang dikodkan chunked, badan respons akan diproses dan dibaca secara automatik. Kita hanya perlu membaca badan respons:
resp, err := http.Get("http://example.com") if err != nil { // handle error } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { // handle error }
Walau bagaimanapun, terdapat beberapa kes di mana pengekodan chunked perlu dimatikan secara manual. Sebagai contoh, ralat ditemui semasa membaca badan tindak balas, atau perlu membaca sebahagian daripada badan tindak balas, menjeda, melakukan beberapa pemprosesan, dan kemudian meneruskan bacaan.
Untuk mematikan pengekodan chunked secara manual, kami boleh menggunakan medan TransferEncoding dalam pakej net/http. Apabila medan TransferEncoding dalam permintaan atau respons mengandungi "chunked", ini bermakna pengekodan chunked digunakan. Kami boleh menetapkan medan TransferEncoding kepada kosong untuk mematikan pengekodan chunk:
req, err := http.NewRequest(http.MethodGet, "http://example.com", nil) if err != nil { // handle error } resp, err := http.DefaultClient.Do(req) if err != nil { // handle error } defer resp.Body.Close() // check if the response is chunked if resp.TransferEncoding != nil && len(resp.TransferEncoding) > 0 && resp.TransferEncoding[0] == "chunked" { resp.TransferEncoding = nil } body, err := ioutil.ReadAll(resp.Body) if err != nil { // handle error }
Dalam kod di atas, kami mula-mula menyemak sama ada respons menggunakan pengekodan chunk. Jika ya, tetapkan medan TransferEncoding kepada kosong dan kemudian baca badan respons.
Untuk meringkaskan, semasa memproses respons http yang dikodkan sebahagian, anda perlu memberi perhatian untuk mematikan pengekodan bongkah. Pengekodan potongan boleh dimatikan secara manual menggunakan medan TransferEncoding.
Atas ialah kandungan terperinci Bagaimana untuk mematikan pengekodan chunked dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!