yumemi-inc / android-training-template

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

API接続の実装

Seo-4d696b75 opened this issue · comments

📩 実際にネットワーク経由でAPIを利用しましょう。今回は無料でも利用できるOpenWeatherMapを使います

Note

Required(先に完了させましょう)

Next(次に取り組みましょう)

  • 必須課題
    #26
  • 任意課題
    #25

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 keyを新たに作成します

アカウントを作成してログイン成功したら、画面右上より「My API keys」を押下
image

画面右側の「Create key」から新しいkeyを作成します
image

すると一覧に作成したkeyが表示されます
スクリーンショット 2023-02-14 19 34 47

利用する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(場合によってはローマ字表記)

参考資料

作成済みのコードを利用する

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と同じ 東京