- ソリューションアーキテクト
- プロジェクトマネージャー
- テクニカルオペレーション
- Other occupations (4)
- Development
- Business
- Other
こんにちは、高知からリモートインターンしている、森田ドラゴンです。前回は処理概要を作ったので、今回は処理詳細の作成です。
処理詳細 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にそこまで詳しい方ではないので、ライブラリや効率的な探索方法を知らないことが原因ですね。ここら辺は詰め直します。