Youtube API ,好像很適合給新手練習,我記得 Codecademy 的 API 教學就是拿 YouTube 的 API 來用。不過,身為一個只會聽歌,不太會使用 YouTube 各種功能的人,實在想不到 YouTube API 要拿來幹嘛,
但就,做了再說吧。

Youtube 畢竟是個很大、使用者很多的網站。除了用戶上傳的資源跟各種關於用戶跟資源的 metadata,還有關於數據分析跟直播功能的部分,所以當然 Youtube API 是個相關 API的集合,包含:
在第一次接觸這個 API , 又沒有特別有想法的時候,就選個基本的 Data API 來查詢搜索 YouTube 資料庫裡面的東西好了。

前面是一些取得 API Key 的教學,跟其他 Google 提供的 API 一樣,使用 YouTube API 也是要透過 Google API Console,在個別的 API 頁面 Enable API 然後取得 Key。
(詳情請見 Day 2 - Google Map Geolocation API)

點進去 Navigation 上面的 Reference 頁:

裡面有詳盡的關於呼叫此 API 的教學,然後往下捲則是關於所有可以得到的資源列表。
YouTube 提供 API 使用者各式各樣的資源(Resource),比方說頻道、播放清單、搜尋結果、影片、留言、訂閱等,各種在 YouTube 上能看到的東西基本上都能取得。
今天就來抓一些關於 YouTube Data API 這個關鍵字的搜尋結果好了。
直接跳到 Search 的部分:

一個 Search 結果可以是跟特定關鍵字相關的
他的 HTTP Request :
'GET', 'https://www.googleapis.com/youtube/v3/search'
在 URL 裡,除了 API Key 之外必須包含 part 參數。這個參數是為了避免大家呼叫 API 時得到太多不相關的資訊,所以用 part 來定義要取得的資料範圍。在 Search 的情況下,設定為 part=snippet 。(詳情請見 How to use the part parameter )
其他可選的參數有:
maxResults:預設為 5 。 可選 0~50。order: 可依照 date、rating、relevance、title 、videoCount、viewCount 排序publishBefore 跟 publishAfter
type :限制搜尋結果為 video、channel 或 playlistq:搜尋關鍵字如此一來,我們的 API Request URL 就會像下面那樣:
// API Request URL
var url =
    "https://www.googleapis.com/youtube/v3/search" +
    "?id=7lCDEYXw3mM" +
    "&key=AIzaSyCta64_vT9ZB43rGLB4Hhtf2hErNFojh0M" +
    "&part=snippet" +
    "&q=YouTube+Data+API" +
    "&type=video" +
    "&videoCaption=closedCaption";
來試試看吧:
var url =
    "https://www.googleapis.com/youtube/v3/search" +
    "?id=7lCDEYXw3mM" +
    "&key=AIzaSyCta64_vT9ZB43rGLB4Hhtf2hErNFojh0M" +
    "&part=snippet" +
    "&q=YouTube+Data+API" +
    "&type=video" +
    "&videoCaption=closedCaption";
function makeRequest(){
  xhr = new XMLHttpRequest();
  xhr.open('GET',url);
  xhr.onload = function(){
    // do something
    var response = JSON.parse(this.responseText);
    for(var i = 0; i<response.items.length ; i++){
      var item = response.items[i];
      var title = item.snippet.title;
      var desc = item.snippet.description;
      var imgUrl = item.snippet.thumbnails.default.url;
       console.log(title,desc,imgUrl)
    }
   
  }
  xhr.send();
}
makeRequest();
得到的結果:

成功了呢。
那今天就先這樣(不對)。
其實簡單的 XHR 物件寫了這麼多天,早就膩了吧?那,換個方法來做 AJAX的話,該怎麼做?
今天就嘗試用用 Fetch API。
Fetch API 是很新的東西,而且是預計要來取代使用 XHR 做 AJAX 的最新技術,畢竟 XHR 最早被各大瀏覽器推出已經是 2005 年的事情,新一代的 XHR Level 2 也是 2011 年的事情了。
但由於 Fetch API 太新,還使用到 ES6 Promise 的特性,正如 ES6 還沒被各瀏覽器完全採用,Fetch API 在某些瀏覽器也不能用。

fetch('Put API Request URL Here', {method: 'get'})
.then(function(response) {
    // do something to response
}).catch(function(err) {
    // do something if error happens
})
那我們來嘗試把上面的 YouTube API 改用 Fetch() 實作一次:
var url =
    "https://www.googleapis.com/youtube/v3/search" +
    "?id=7lCDEYXw3mM" +
    "&key=AIzaSyCta64_vT9ZB43rGLB4Hhtf2hErNFojh0M" +
    "&part=snippet" +
    "&q=YouTube+Data+API" +
    "&type=video" +
    "&videoCaption=closedCaption";
fetch( url, {method: 'get'})
.then(function(response) {
    // do something to response
  console.log(response);
  
}).catch(function(err) {
    // do something if error happens
  console.log('error')
})
結果如下:

咦,裡面怎麼好像沒有先前的資料呢?
這是因為,使用 Fetch 的 Request 會回傳 一個Promise 物件的 Response,必須經過一些處理才能取的我們想要的東西。
如果在 response 後面加一個 .json 的 method,再放一個.then() 來處理從 promise 裡拿出來的東西,像這樣:
fetch( url, {method: 'get'})
  .then(function(response) {
    response.json().then(
      function(data){
        console.log(data);
      }
    )
  }).catch(function(err) {
    console.log('error')
});
就可以看到傳回來的東西變成這樣:

把前面 XHR 物件 .onload()  裡面,把我想要的資料的 Loop 放進去 .then() 裡,就得到了跟剛剛一模一樣的結果了。

結束。(我懶得把東西弄進 HTML 裡了,就這樣吧)
Codepen 連結