Bagaimana untuk mematikan pengekodan chunked dalam golang

PHPz
Lepaskan: 2023-04-04 17:21:01
asal
719 orang telah melayarinya

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

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!