我想这可能是我关于SO的第一个问题。我刚刚沉浸在Go中。我刚读完Go编程简介,我只想写一个简单的程序来查询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("%Tn", err)
// fmt.Println("Error:", err)
log.Fatal(err)
}
for _, v := range vs.Items {
fmt.Println(v.Id.VideoId, v.Snippet.Title)
}
}
这是我的回购请求中的程序链接。go
我很惊讶你的例子能起作用,假设这就是全部,因为你还没有为url := base_url + query + api_key
定义base_url
或query
。我宁愿把它作为评论而不是回答,但我没有足够的代表这样做。
我假设你已经尝试过了,但我会打印出你构建的url,并仔细检查它看起来像
https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
您应该考虑使用net/url包来构建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密钥,并且它确实对数据API有效,那么这可能是出了问题的地方。显然,你想把这个逻辑分解成一个函数调用,使其更可重用,但你已经明白了。