我很难从GETGo中的请求中读取XML .我刚开始学习Go并且没有找到关于这个主题的任何资源.我尝试了什么:
response, err := http.Get(url)
if err != nil {
log.Fatal(err)
} else {
defer response.Body.Close()
xml, _ := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
}
Run Code Online (Sandbox Code Playgroud)
_, err := io.Copy(os.Stdout, response.Body)但是我想存储XML以便进一步处理.任何帮助是极大的赞赏.
icz*_*cza 15
你尝试过的大多数都是好的.几件事情无法改善:
http.Get()返回一个http.Response可选错误.如果没有错误,那只表示HTTP GET操作成功,但服务器可能已响应错误文档.所以你仍然需要检查响应HTTP状态代码.
同时io.ReadAll()也返回错误(除了读取数据),不要忘记检查这一点.
让我们把它包装在一个函数中:
func getXML(url string) (string, error) {
resp, err := http.Get(url)
if err != nil {
return "", fmt.Errorf("GET error: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("Status error: %v", resp.StatusCode)
}
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", fmt.Errorf("Read body: %v", err)
}
return string(data), nil
}
Run Code Online (Sandbox Code Playgroud)
测试/使用上述功能:
if xmlStr, err := getXML("http://somehost.com/some.xml"); err != nil {
log.Printf("Failed to get XML: %v", err)
} else {
log.Println("Received XML:")
log.Println(xmlStr)
}
Run Code Online (Sandbox Code Playgroud)
另请注意,获取任何其他响应的内容是相同的,因此不值得"编码" string转换和返回类型.这个更通用:
func getContent(url string) ([]byte, error) {
resp, err := http.Get(url)
if err != nil {
return nil, fmt.Errorf("GET error: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("Status error: %v", resp.StatusCode)
}
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("Read body: %v", err)
}
return data, nil
}
Run Code Online (Sandbox Code Playgroud)
使用它来获取XML文档:
if data, err := getContent("http://somehost.com/some.xml"); err != nil {
log.Printf("Failed to get XML: %v", err)
} else {
log.Println("Received XML:")
log.Println(string(data))
}
Run Code Online (Sandbox Code Playgroud)