我认为这可能是我关于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
中程序的链接答案 0 :(得分:2)
我对您的示例工作感到惊讶,假设这是完整的事情,因为您还没有为base_url
定义query
或url := 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有效。显然,您希望将该逻辑强制转换为函数调用以使其更具可重用性,但您明白了。