xml.NewDecoder(resp.Body).Decode 中出现 EOF 错误
问题:
尝试使用 xml.NewDecoder(resp.Body).Decode 从 HTTP 响应中解码 XML 时,尽管已使用 xml.Unmarshal 成功解码响应正文,但仍会出现错误“EOF”。
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>
说明:
发生错误“EOF”(文件结束),因为响应正文已被 ioutil 消耗前面几行中的.ReadAll(resp1.Body)。此函数读取正文中的所有数据,直到 EOF,不留下任何内容供 xml.NewDecoder 解码。
解决方案:
要解决此问题,正文内容应该在使用 xml.NewDecoder 解码之前将其复制到新的 io.Reader 中。这允许多个阅读器访问正文的内容。
一种方法是使用 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中文网其他相关文章!