5-1 申請使用中央氣象局 API

本單元對應的專案分支為 register-cwb-opendata

單元核心#

這個單元的主要目標包含:

  • 取得中央氣象局 API 授權碼
  • 試著透過授權碼取得天氣資訊
  • 了解在本專案中會使用到的兩支 API

天氣資訊 API 的選擇#

在「臺灣好天氣」中需要取得即時的天氣資訊,因此要尋找能夠提供這方面資料的第三方服務。比較常聽到提供天氣 API 的網站包括 OpenWeatherAccuWeather,這兩個網站都有提供免費但有限制請求數量的 API 可供使用,就一般的需求來說其實非常足夠了。

在台灣,我們如果想取得最精確的即時天氣資訊,擁有最多台灣氣象觀測站的中央氣象局自然是首選,因此這裡我們會註冊中央氣象局的 API 來使用,若未來想要延伸到國際使用,那就可以選擇像是 OpenWeatherAccuWeather 這類的服務。

登入/註冊會員#

首先打開中央氣象局的氣象開放資料平台,點選右上方的「登入/註冊」:

imgur

如果還不是會員的話,可以選擇用 Facebook 登入或註冊一個新的。

info

在註冊帳號的過程中,如果有遇到無法使用 Facebook 登入的情況,可以嘗試用個人的 email 申請。

取得授權碼#

不論是天氣資訊、Google 地圖、Instagram 或 Facebook 等第三方的 API 服務,都不會讓你「匿名」使用,多數都會需要先註冊後,才會發給你一組「金鑰(Key)」,之後所有對該服務所發送的請求都需要附帶上這組金鑰,這些服務的供應者就可以透過此把金鑰來辨認你使用他們服務的頻率和情況。

中央氣象局也不例外,登入之後只需要點擊「取得授權碼」之後,你就會得到一組專屬於你的授權碼,接下來透過 API 向中央氣象局請求天氣資訊的時候,都會需要使用到這把金鑰:

imgur

了解 API 如何使用#

在取得 API 金鑰後,再來就是要看怎麼樣使用這個服務,多數有提供 API 服務的網站一定會附上使用說明,不然開發者即使通靈可能還是沒辦法正確請求到想要的資料。如果該公司服務內容非常龐大的話,像是 Amazon、Google 等甚至還會提供一個工具包(SDK)給開發者使用,讓開發者可以更快速上手這些服務。

在中央氣象局的網站中可以點選「開發指南」,裡面就附上「使用說明」的 PDF 文件,也很貼心的提供了線上說明文件

imgur

線上說明文件的好處在於你可以在這個網站上直接嘗試使用這些 API,不用另外開啟測試 API 請求的服務(例如 Postman),也不用再另外自己架設伺服器。這個部分中央氣象局的網站真的做得不錯:

imgur

現在我們就可以使用這份線上說明文件來測試 API 請求。

在「臺灣好天氣」這個專案中,主要會用到中央氣象局提供的兩支 API,分別為:

  • 觀測中的:/v1/rest/datastore/O-A0003-001 局屬氣象站-氣象觀測資料
  • 預報中的:/v1/rest/datastore/F-C0032-001 一般天氣預報-今明 36 小時天氣預報

之所以會需要使用到兩支不同的 API,是因為在「氣象觀測資料」中能夠取得當前最即時的天氣資料,像是當時的「溫度」、「風速」等等;而在「天氣預報」的資料中,則可以取得未來的降雨機率、天氣描述等等。

試用看看 API#

現在讓我們試試看如何透過授權碼取得「天氣觀測」和「天氣預報」的資料。

局屬氣象站-天氣觀測資料#

首先在線上說明文件的網站中找到「局屬氣象站-氣象觀測資料」的欄位,裡面會列出各個參數的說明,接著點選右上方的「Try it out」來試試看請求後會得到什麼回應:

Imgur

其中 Authorization 需要填入的就是剛剛登入後取得的「API 授權碼」,其餘部分可以直接不填讓它帶入預設值,比較重要的是 locationName 這個欄位,不填的話預設會回傳所有氣象站的資料,之後我們在做搜尋功能的時候,則可以帶入指定的「測站名稱」,這裡你可以留空來取得所有測站的觀測資料,或者可以試著填入「臺北」來取得台北觀測站的資料:

Imgur

接著點選下方的「Execute」後,便可以看到該觀測站的觀測資料。

同時你可以看到在下圖發出的 Request URL,因為使用的是 GET 請求,所以若把這串 Request URL 貼到瀏覽器網址列將一樣可以看到回傳的結果:

Imgur

一般天氣預報-今明 36 小時天氣預報#

接著我們來看一下「一般天氣預報-今明 36 小時天氣預報」這支 API,一樣在中央氣象局的線上說明文件可以找到,點擊該 API 右上角的「Try it out」後可以在各欄位中填入資料:

Imgur

同樣可以在 Authorization 的地方填入「授權碼」,其他地方一樣留預設值即可;locationName 的地方同樣不選的話會回傳各個縣市的天氣資料,你也可以選擇想要取得資料的縣市名稱:

Imgur

注意到 locationName 這個欄位,這裡的欄位填入的會是「縣市」名稱,也就是「宜蘭縣」、「花蓮縣」、「台東縣」等等,而不是和前面提到的那支「氣象觀測資料 API」,前面那支 API 的 locationName 要帶入的是「觀測站」的名稱,而不是「縣市」名稱。

之所以要留意 locationName 這個欄位,是因為未來在「臺灣好天氣」的 App 中,可以讓使用者去選擇「地區」,以取得該地區的天氣資訊,這裡雖然兩支 API 中欄位名稱都是 locationName,但實際上需要填入的資料是不同的,一個是「觀測站」、一個是「縣市」,未來假設使用者想要了解臺北市的天氣資訊時,我們可以用「臺北市」這個名稱,去查詢「一般天氣預報」這支 API,但若要查詢的是「天氣觀測資料」,使用「臺北市」會查不到資料,因為「臺北市」並不是觀測站的名稱,需要使用「臺北」這個觀測站的名稱才能找到對應的觀測資料。同時,每個縣市「觀測站」的數量和名稱也都不同,

這裡讀者們可以先留意一下會有這樣的情況即可,避免未來自己在嘗試撈取某地區的資料時感到困惑。未來會在實作切換縣市的天氣資訊時在做更多的說明。

換你了!申請一組專屬於你的授權碼#


本單元相關之網頁連結可於 register-cwb-opendata 分支檢視:

https://github.com/pjchender/learn-react-from-hook-realtime-weather-app/tree/register-cwb-opendata

Imgur