API接続の実装
Seo-4d696b75 opened this issue · comments
📩 実際にネットワーク経由でAPIを利用しましょう。今回は無料でも利用できるOpenWeatherMapを使います
Important
この課題は選択必須です
ご自身で直接実装する代わりに作成済みのコードを利用する選択もできます
課題内容
- OpenWeatherMapのAPI keyを取得する
- API keyをコードとは別ファイルに保存する
- RetrofitでCurrent Weather Data APIを呼び出す
- 天気・最低気温・最高気温・都市名を画面に表示する
API keyの保存
API keyなど認証情報は自分以外に知られたくはありません。センシティブな情報はソースコードにハードコーディングせず、別ファイルに保存してソースコードから読み出して使いましょう。ただ認証情報を書いたファイルをそのままGitHubに公開しては意味がないので、**/.gitignore
ファイルを適宜編集してGitHub上にpushされないよう注意しましょう 🚨
RetrofitでAPI呼び出し
Retrofitライブラリを利用するとinterfaceによる抽象的な定義だけで通信を簡単に実装できます 🚀
加えてConverterを指定すればAPIレスポンスの文字列からデータモデルのデコードまで処理しくれます!以前の課題で kotlin-serializationによるJSONデコードを実装したので、同じく kotlin-serializationを利用するKotlin Serialization Converterを使ってください。
動作イメージ
OpenWeatherMapの説明
API keyの取得
利用するAPI
OpenWeatherMapでは多種のAPIが提供されていますが、今回は無料枠でも使用できる current weather dataを呼び出します
APIのパラメータ指定やレスポンスの詳細などはAPI docsを参照しましょう
Tip
地点の緯度経度lon, lat
でも指定できますが、意図しない都市がヒットする場合があります。代わりに都市IDid
をクエリパラメータに指定してください。有効な都市IDの例を下の表に示しましたので、ランダムな都市を選んで天気情報を取得してみましょう。
都市ID一覧
都市名 | id | country |
---|---|---|
札幌 | 2128295 | JP |
釧路 | 2129376 | JP |
仙台 | 2111149 | JP |
新潟 | 1855431 | JP |
東京 | 1850144 | JP |
名古屋 | 1856057 | JP |
金沢 | 1860243 | JP |
大阪 | 1853909 | JP |
広島 | 1862415 | JP |
高知 | 1859146 | JP |
福岡 | 1863967 | JP |
鹿児島 | 1860827 | JP |
那覇 | 1856035 | JP |
New York | 5128581 | US |
London | 2643743 | GB |
都市名は日本語で、数値はメートル法でJSONを返してもらうには、クエリパラメータにlang=ja, units=metric
を付与します。
APIレスポンスの読み方
前回の課題で利用したYumemiWeather
のレスポンスに対応するフィールドは、
- weather:
.weather[0].id
(idと天気状態の対応はWeather ConditionのAPI docsを参照) - maxTemp:
.main.temp_max
- minTemp:
.main.temp_min
- date:
.dt
(秒単位のUnix Timestamp) - area:
.name
(場合によってはローマ字表記)
参考資料
- WWW Creators - .gitignoreの書き方
- Retrofit
- Kotlin Serialization Converter
- OpenWeatherMap - current weather data
作成済みのコードを利用する
template/api-current-weather
ブランチをmainまたは作業ブランチにmergeしてください
API keyの指定
OpenWeatherMapから取得したAPI keyを記載したapi/apikey.properties
ファイルを追加します
(ファイルは.gitignoreに指定されているのでGitHub上に公開されません)
api_key="your_api_key"
API Serviceの初期化
特にパラメータを指定しなければapi/apikey.properties
で指定したAPI keyを利用します
val weather = YumemiWeather()
利用する関数
YumemiWeather
suspend fun fetchJsonWeatherAsync(json: String) : String
- ランダムにエラーが発生してUnknownExceptionをthrowします
- Requestで指定した都市の天気情報をJSON形式の文字列で返します
- Requestで指定した都市が既知の都市ID一覧に含まれない場合はIllegalArgumentExceptionをthrowします
Request, ResponseのJSON形式は前課題と同じです
Parameter
Json文字列
Key | 型 | フォーマット | 例 |
---|---|---|---|
area | String | 都市名 | 東京 |
date | String | ISO8601拡張形式 "yyyy-MM-dd'T'HH:mm" | 2020-04-01T12:00 |
Returns
Json文字列
Key | 型 | フォーマット | 例 |
---|---|---|---|
weather | String | sunny, cloudy, rainy, snow | sunny |
maxTemp | Int | -- | 20 |
minTemp | Int | -- | -20 |
date | String | ISO8601拡張形式 "yyyy-MM-dd'T'HH:mm" | 2020-04-01T12:00 |
area | String | requestと同じ | 東京 |