从Golang中的http.Get中读取内容

时间:2017-03-10 11:48:46

标签: http go get

我很难从Go中的GET请求中读取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)
            }
        }

_, err := io.Copy(os.Stdout, response.Body)有效,但我想存储XML以便进一步处理。 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:13)

你所尝试的大多数都是好的。几点没有改进它:

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
}

测试/使用上述功能:

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)
}

另请注意,获取任何其他回复的内容都是一样的,所以它不值得"编码" 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
}

使用它来获取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))
}