Apabila membangun di Golang, kami selalunya perlu menghantar permintaan ke antara muka lain dan kemudian membaca kandungan badan respons. Walau bagaimanapun, dalam proses pembangunan sebenar, kita sering menghadapi beberapa kesilapan dalam membaca kandungan badan Mari kita meneroka punca dan penyelesaian masalah ini.
1.1. Tamat masa permintaan rangkaian
Selepas permintaan rangkaian dihantar, jika tiada respons diterima dalam masa yang ditetapkan, a masa tamat akan berlaku. Dalam kes ini, membaca kandungan badan tindak balas akan gagal.
Penyelesaian: Untuk ralat tamat masa, kita boleh menggunakan pakej konteks untuk menetapkan tamat masa untuk mengelakkan ralat tersebut.
1.2. Pengecualian kod status permintaan HTTP
Apabila membuat permintaan HTTP, apabila menerima kod status tertentu, seperti 401, 403, dll., pelayan akan mengembalikan mesej ralat masa, baca Mengambil kandungan badan respons akan gagal.
Penyelesaian: Dalam permintaan HTTP, kami boleh menilai sama ada permintaan itu berjaya mengikut kod status respons Untuk kod status bukan 200, kami boleh mendapatkan gesaan pengecualian dengan membaca maklumat ralat.
Kod contoh:
resp, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { data, _ := ioutil.ReadAll(resp.Body) log.Println("Response Error: ", string(data)) return } body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) }
1.3. Pengecualian sambungan rangkaian
Apabila membuat permintaan rangkaian, jika sambungan rangkaian tidak normal, membaca kandungan badan respons akan gagal.
Penyelesaian: Untuk memastikan kestabilan sambungan rangkaian, kami boleh meningkatkan tamat masa sambungan rangkaian, dan untuk situasi tidak normal seperti gangguan sambungan rangkaian, kami perlu melakukan pengendalian pengecualian.
Kod sampel:
client := &http.Client{ Timeout: time.Second * 10, } resp, err := client.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { data, _ := ioutil.ReadAll(resp.Body) log.Println("Response Error: ", string(data)) return } body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) }
Dalam pembangunan Golang, kegagalan membaca kandungan badan tindak balas mungkin berlaku dalam pelbagai situasi, seperti rangkaian Permintaan tamat masa, pengecualian kod status permintaan HTTP, pengecualian sambungan rangkaian, dsb. Melalui pengendalian pengecualian yang munasabah dan penghakiman ralat, kita boleh mengelakkan kesan buruk masalah ini pada program. Pada masa yang sama, adalah disyorkan bahawa semasa menghantar permintaan rangkaian, cuba gunakan perpustakaan standard yang disediakan oleh Golang untuk memastikan kebolehpercayaan dan kecekapan kod.
Atas ialah kandungan terperinci badan bacaan ralat golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!