Maison > développement back-end > Golang > Pourquoi `xml.NewDecoder(resp.Body).Decode` renvoie-t-il une erreur \'EOF\' après que `ioutil.ReadAll(resp1.Body)` ait lu le corps de la réponse ?

Pourquoi `xml.NewDecoder(resp.Body).Decode` renvoie-t-il une erreur \'EOF\' après que `ioutil.ReadAll(resp1.Body)` ait lu le corps de la réponse ?

Patricia Arquette
Libérer: 2024-10-29 15:57:02
original
770 Les gens l'ont consulté

Why does `xml.NewDecoder(resp.Body).Decode` return an

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal