使用Go的net / http包连接到YouTube API的问题

时间:2014-11-06 15:01:38

标签: go youtube-api

我认为这可能是我关于SO的第一个问题。我一直沉浸在Go中。我刚读完了 Go in Programming ,我想编写一个简单的程序来查询YT Data API v3。

问题:当我执行go run request.go时出现404 Not Found错误。但是,当我使用传递的URL并粘贴到我的浏览器或Postman中时,请求正常。这是func main() {}的样子:

func main() {
    // read in API key
    key, error_ := ioutil.ReadFile("user_data.txt")
    if error_ != nil {
        log.Fatal(error_)
    }
    api_key += string(key)

    // buil url
    url := base_url + query + api_key
    // Uncomment the next line to show that I'm not insane.
    // url = "http://ip.jsontest.com/"

    // make request
    resp, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    body, error_g := ioutil.ReadAll(resp.Body)
    if error_g != nil {
        fmt.Println(error_g)
    }
    fmt.Println(resp.Status)
    fmt.Println(resp.Request)
    fmt.Println(string(body))
    defer resp.Body.Close()
    // parse response
    var vs Videos
    err = json.NewDecoder(resp.Body).Decode(&vs)
    if err != nil {
        fmt.Printf("%T\n", err)
        // fmt.Println("Error:", err)
        log.Fatal(err)
    }
    for _, v := range vs.Items {
        fmt.Println(v.Id.VideoId, v.Snippet.Title)
    }
}

以下是我的回购request.go

中程序的链接

1 个答案:

答案 0 :(得分:2)

我对您的示例工作感到惊讶,假设这是完整的事情,因为您还没有为base_url定义queryurl := base_url + query + api_key。我宁愿将其留作评论而非答案,但我没有足够的代表这样做。

我假设您已经尝试过此操作,但我打印出您的内置网址并仔细检查它看起来像

https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY

您应该考虑使用的另一个可能间接解决问题的方法是构建网址的net/url包。然后你可以做类似的事情:

params := url.Values{}
params.Add("id", video_id)
params.Add("key", api_key)

url := &url.Url{
    Host: 'https://www.googleapis.com/youtube/v3/videos',
    Query: params.Encode()
}

get_url := url.String()

它有点繁琐,但这里的优势在于它可以为您完成所有编码和查询构建。我的猜测是,这可能是出现问题的地方,假设您正确地读取了您的API密钥,并且它确实对Data API有效。显然,您希望将该逻辑强制转换为函数调用以使其更具可重用性,但您明白了。