ホームページ >バックエンド開発 >Golang >`ioutil.ReadAll(resp1.Body)` が応答本文を読み取った後、`xml.NewDecoder(resp.Body).Decode` が「EOF」エラーを返すのはなぜですか?

`ioutil.ReadAll(resp1.Body)` が応答本文を読み取った後、`xml.NewDecoder(resp.Body).Decode` が「EOF」エラーを返すのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-29 15:57:02710ブラウズ

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

xml.NewDecoder(resp.Body).Decode の EOF エラー

質問:

xml.NewDecoder(resp.Body).Decode を使用して HTTP 応答から XML をデコードしようとすると、応答本文が xml.Unmarshal.

コードで正常にデコードされたにもかかわらず、エラー「EOF」が発生します。 :

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

説明:

応答本文が既に ioutil によって消費されているため、エラー "EOF" (End-of-File) が発生します。前の行の .ReadAll(resp1.Body)。この関数は、EOF まで本文からすべてのデータを読み取り、xml.NewDecoder がデコードするものは何も残しません。

解決策:

問題を解決するには、本文のコンテンツを次のようにする必要があります。 xml.NewDecoder でデコードする前に、新しい io.Reader にコピーする必要があります。これにより、複数のリーダーが本文のコンテンツにアクセスできるようになります。

1 つの方法は、bytes.NewReader を使用して本文のコンテンツから新しいリーダーを作成することです。

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

あるいは、resp1.Body を次のようにすることもできます。 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>
を使用して初期状態に「巻き戻す」

以上が`ioutil.ReadAll(resp1.Body)` が応答本文を読み取った後、`xml.NewDecoder(resp.Body).Decode` が「EOF」エラーを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。