使用xml.NewDecoder(resp.Body).Decode会出现EOF错误_GOLang。

5

我正在尝试解码HTML响应的XML内容。

=>我将响应正文保存为字符串变量,并成功使用xml.Unmarshal函数进行了解码。代码如下:

    err = xml.Unmarshal([]byte(outs), &v)
       if err != nil {
    fmt.Printf("error is here: %v", err)
    return
                       }

我认为问题不在于响应正文的实际内容。

现在是我的实际代码:

req1, err := http.NewRequest("GET", concat([]string{domain, defects_link}), nil)
error_handler(err)
req1.Close = true //I tried with and without this line 

resp1, err := client.Do(req1)
error_handler(err)

fmt.Printf("\n %s \n", resp1.Status)

defer resp1.Body.Close()//I tried with and without this line
conts1, err := ioutil.ReadAll(resp1.Body)
error_handler(err)
fmt.Println("Response Body is Here :", string(conts1))//Contents are Printed Here

以上代码的最后一行打印响应。但是下面的代码会出现“错误:EOF”。

    if err := xml.NewDecoder(resp1.Body).Decode(&v); err != nil {
    fmt.Printf("error is : %v", err)

    return
}

我的代码出了什么问题,请帮忙。


你是在使用 ioutil.ReadAll 之后再解码(Decode)还是只是一个测试而打印(print) ioutil.ReadAll? - chendesheng
1
在实际代码中有 ioutil.ReadAll,现在我明白了这就是为什么我的代码没有工作的原因,来自 VonC 的回答。 - faisal_kk
1个回答

8
如果你已经使用 conts1, err := ioutil.ReadAll(resp1.Body) 一次读取了Body io.ReadCloser,你就不能再让另一个函数再读它一次(否则会收到EOF错误消息)。

我把这个响应体以字符串形式保存到变量中,然后成功地使用 xml.Unmarshal 函数对其进行解码。

这似乎是多次使用正文内容的最简单方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接