1
/
5

森田ドラゴンのインターンシップ ~22日目~ お天気APIの設計完了?

こんにちは、高知からリモートインターンしている、森田ドラゴンです。前回は処理概要を作ったので、今回は処理詳細の作成です。

処理詳細 API GW

APIは何度か利用してプログラム書いたことがあるので、わかったつもりになっていたんですけど、処理をどこで行なっていて、どこで受け口をやっているのかわかっていませんでした。

今回のAPIでいうと、受け口はAPI GW、処理はLambda という形になります。考えてみれば当たり前な気もしますが、わかっていなかったです。


API GWの処理詳細、というか設定詳細はSwaggerで書きました。パス・リクエスト・レスポンス。この3つがAPIには必要です。ただ、URLで呼ぶだけがAPIではないらしいので、そこらへんの手法も勉強したいです。

途中で、

Structural error at paths./weather/{date}/{city}.get.parameters.0
should NOT have additional properties
additionalProperty: descriptoin
Jump to line 15description

15行目のdescriptoinがいらないよーとエラーを吐いていて「parametersには説明をつけられないのか」勝手に納得していましたが、今よく見たら普通にスペルミスしてました。反省です。

処理詳細 Lambda

Lambdaの処理は、livedoorのお天気apiからどうやってデータを引っ張ってこようか悩みました。処理としては、以下になります。

api gw から受け取る入力 (api gw でエンドポイントを作るイメージ)
string date
string city
------cityで探索
city を使ってhttp://weather.livedoor.com/forecast/rss/primary_area.xmlを探索
xmlのデータをjsonに変換 -> ライブラリはhttps://pypi.org/project/xmljson/
この中から都市名に合致するidを取得 -> なければエラーを返す
------idでapiを叩く
idを使って、http://weather.livedoor.com/forecast/webservice/json/v1?city= id
ここから天気を取得
取得した天気から、指定された日付のデータを受け取る ( date を使う)
livedoorの天気画像のurlを取得
-> ブラウザに天気画像のurlを返す(レスポンス)

5行目の cityを使ってcityを使ってhttp://weather.livedoor.com/forecast/rss/primary_area.xmlを探索。という箇所で悩みました。「そのままこのurl叩けば、都市のIDデータ一覧返ってくるじゃん」ていう話なんですけど、その時は

「このデータもAPIを叩いた結果返ってきているデータのはずだから、適切なAPIの入り口があるはず。例えば "都市の名前を渡すと、その都市のidを含んだデータが返ってくる"のようなAPIが」

と、ひねった考え方をしてしまって悩んでいました。 返ってきたデータがxml形式だったことも悩んだ原因の一つです。APIは jsonかxmlでデータを返すようです。詳細を書いたと思っていましたが、探索をどのように行うかなど曖昧な部分が多いですね。そこを詰めて、次回コードを書けるようにします。

AWSの構成図とjsの処理

Cacooを使って書こうと思ったんですが、なぜかログインできなかったので、別のツールでざっくりと書きました。AWS側はほとんど処理することがないですね。js側の処理もほとんどなく、

1 「天気をみる」 ボタンがクリックされたら、都市名・日付が入力されているか 確認
2 上記のデータを API GW のエンドポイントに送る
3 レスポンスが400 エラーなら、alertでエラーを通知
4 レスポンスが 200 なら、返ってきた URLを<img>タグの href要素に代入

といった感じです。

感想

詳細を詰めれた気がしていたんですが、Lambdaの方に関してはダメですね。そもそもpythonにそこまで詳しい方ではないので、ライブラリや効率的な探索方法を知らないことが原因ですね。ここら辺は詰め直します。

株式会社サーバーワークスでは一緒に働く仲間を募集しています
1 いいね!
1 いいね!
同じタグの記事
今週のランキング
株式会社サーバーワークスからお誘い
この話題に共感したら、メンバーと話してみませんか?