Erreur EOF dans xml.NewDecoder(resp.Body).Decode
Question :
Lorsque vous tentez de décoder du XML à partir d'une réponse HTTP à l'aide de xml.NewDecoder(resp.Body).Decode, l'erreur "EOF" se produit malgré le décodage réussi du corps de la réponse avec xml.Unmarshal.
Code :
<code class="go">req1, err := http.NewRequest("GET", concat([]string{domain, defects_link}), nil) error_handler(err) req1.Close = true resp1, err := client.Do(req1) error_handler(err) fmt.Printf("\n %s \n", resp1.Status) defer resp1.Body.Close() conts1, err := ioutil.ReadAll(resp1.Body) error_handler(err) fmt.Println("Response Body is Here :", string(conts1))//Contents are Printed Here if err := xml.NewDecoder(resp1.Body).Decode(&v); err != nil { fmt.Printf("error is : %v", err) return }</code>
Explication :
L'erreur "EOF" (End-of-File) se produit car le corps de la réponse a déjà été consommé par ioutil .ReadAll(resp1.Body) dans les lignes précédentes. Cette fonction lit toutes les données du corps jusqu'à EOF, ne laissant rien à décoder par xml.NewDecoder.
Solution :
Pour résoudre le problème, le contenu du corps doit être copié dans un nouveau io.Reader avant de décoder avec xml.NewDecoder. Cela permet à plusieurs lecteurs d'accéder au contenu du corps.
Une approche consiste à utiliser bytes.NewReader pour créer un nouveau lecteur à partir du contenu du corps :
<code class="go">bodyBuffer := bytes.NewReader(conts1) decoder := xml.NewDecoder(bodyBuffer) err := decoder.Decode(&v) if err != nil { fmt.Printf("error is : %v", err) }</code>
Alternativement, resp1.Body peut être "rembobiné" à son état initial en utilisant resp1.Body.Seek(0, 0):
<code class="go">_, err = resp1.Body.Seek(0, 0) if err != nil { fmt.Printf("error is : %v", err) } decoder := xml.NewDecoder(resp1.Body) err = decoder.Decode(&v) if err != nil { fmt.Printf("error is : %v", err) }</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!