错误:读取Post请求的XML正文时遇到EOF

3

当我读取XML响应正文时,控制台显示错误:EOF

以下是我的代码。

resp, err := http.Post(url, "application/xml", payload)
if err != nil {
    response.WriteErrorString(http.StatusInternalServerError, err.Error())
    return
}

defer resp.Body.Close()
dec := xml.NewDecoder(resp.Body)

if debug == true {
    body, err := ioutil.ReadAll(resp.Body)
    fmt.Println("=========== Response ==================")
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
    fmt.Println(string(body))
    fmt.Println("=========== Response Ends =============")
}

err = dec.Decode(respStruct)

我怀疑ioutil.ReadAll未按预期工作。

它抛出错误的原因是什么?

1个回答

3

xml.NewDecoder(resp.Body) 可能已经读取了 resp.Body 的内容。
因此会出现 EOF 错误信息。

你可以在 "xml.NewDecoder(resp.Body).Decode Giving EOF Error" 中看到相同的错误信息。

首先阅读 resp.Body,然后使用带有 xml.Unmarshal 的字符串可以避免双重读取和错误信息。

注意:类似的答案显示,当从流中读取时最佳实践仍然是使用xml.Decoder而不是xml.Unmarshal
因此请确保不要两次读取 resp.Body,它将正常工作。


NewDecoder 怎么样?这个方法似乎很好用,但问题是如何将该方法的响应读取为字符串。 - Passionate Engineer
http://stackoverflow.com/a/26095813/6309 展示了你正在正确的轨道上,但是读取resp.Body时需要小心。我的旧回答(https://dev59.com/a4Hba4cB1Zd3GeqPVL7N#24880114)是关于先将resp.Body读入字符串,然后使用UnMarshal而不是NewDecoder的方法。 - VonC

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