2014-11-06 117 views
1

我認爲這可能是我在SO上的第一個問題。我剛剛沉浸在Go中。我剛剛讀完編程簡介我想寫一個簡單的程序來查詢YT Data API v3。使用Go的net/http包連接到YouTube API的問題

問題:執行go run request.go時出現404 Not Found錯誤。但是,當我採用已通過的URL並粘貼到瀏覽器或郵遞員時,請求可以正常工作。這裏是我的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

我已經取消了該行並從jsontest中獲得了200 OK。您提供的代碼與不起作用的代碼不同,或者您的網絡中有某些代碼。 – 2014-11-06 16:38:48

+0

如果您有Google開發人員API密鑰,請創建一個名爲'user_data.txt'的文件並將其粘貼到該文件中。確保該文件與'request.go'位於同一個目錄中。重新評論'ip.jsontest.com'這一行,然後再試一次,看看它是否會起作用。 – Tuss4 2014-11-06 19:18:24

+1

與您的問題無關 - Google確實爲Go編寫了一個用於Youtube的API客戶端:https://developers.google.com/youtube/v3/code_samples/go – TheHippo 2014-11-09 17:34:06

回答

2

我很驚訝,你的榜樣作品的鏈接程序,假設是整個事情,因爲你還沒有對於url := base_url + query + api_key定義爲base_urlquery。我寧願將它作爲評論而不是答案,但我沒有足夠的代表這樣做。

我假設你已經嘗試過這一點,但我會打印出您的內置URL和仔細檢查它看起來就像

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有效。很明顯,你會想把這個邏輯放到一個函數調用中,使它更加可重用,但是你明白了。

+0

看看[request.go](https://github.com/Tuss4/go_book_training/blob/master/request.go),我會嘗試使用'net/url'軟件包。 – Tuss4 2014-12-16 03:32:11

+0

從文檔看來,如果你的URL格式錯誤,你應該得到一個'400錯誤請求'。由於您收到404,因此您的令牌存在問題的可能性更大。您是否已經按照API [簡介](https://developers.google.com/youtube/v3/getting-started#intro)中的所有步驟設置了API密鑰? – 2014-12-16 20:56:44

+0

是的。當你使用像POSTMAN這樣的客戶端或瀏覽器時,即使使用curl,它也能正常工作。 – Tuss4 2014-12-17 14:55:03