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
755 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!

source:php.cn
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