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 サイトの他の関連記事を参照してください。