在Go中请求多个URL

时间:2015-04-02 15:59:28

标签: go

我有以下Go程序:https://play.golang.org/p/-TUtJ7DIhi

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "strconv"
)

func main() {
    body, err := get("https://hacker-news.firebaseio.com/v0/topstories.json")

    if err != nil {
        panic(err)
    }

    var ids [500]int
    if err = json.Unmarshal(body, &ids); err != nil {
        panic(err)
    }

    var contents []byte
    for _, value := range ids[0:10] {
        body, err := get("https://hacker-news.firebaseio.com/v0/item/" + strconv.Itoa(value) + ".json")

        if err != nil {
            fmt.Println(err)
        } else {
            contents = append(contents, body...)
        }
    }

    fmt.Println(contents)
}

func get(url string) ([]byte, error) {
    res, err := http.Get(url)
    if err != nil {
        return nil, err
    }

    body, err := ioutil.ReadAll(res.Body)
    res.Body.Close()

    return body, err
}

运行时会在迭代获取请求中抛出EOF json个错误,但是当我单独点击这些URL时,它们似乎没有格式错误。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

看起来他们的服务器出现了问题,并且在没有发送Connection: close标头的情况下正在关闭连接。因此,客户端尝试根据HTTP / 1.1规范重用连接。

您可以通过创建自己的请求,设置Close = true或使用DisableKeepAlives = true

自定义传输来解决此问题
req, err := http.NewRequest("GET", url, nil)
if err != nil {
    return nil, err
}
req.Close = true

res, err := http.DefaultClient.Do(req)
if err != nil {
    return nil, err
}