首页 > 后端开发 > Golang > 为什么在 `ioutil.ReadAll(resp1.Body)` 读取响应正文后,`xml.NewDecoder(resp.Body).Decode` 返回 \'EOF\' 错误?

为什么在 `ioutil.ReadAll(resp1.Body)` 读取响应正文后,`xml.NewDecoder(resp.Body).Decode` 返回 \'EOF\' 错误?

Patricia Arquette
发布: 2024-10-29 15:57:02
原创
708 人浏览过

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 :

<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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板