爆速でAPI的なのを作りたかった時にCloud Firestoreを使うとよかった | Chakuyo-bako API作成編

Chakuyo-bakoの展示前日、どうしても機能追加したかったので8時間くらいでデータの取り込みからiOSの実装まで終わるAPIが欲しかったのです。

express / MySQLでやるのがスキルセット的には一番早くできそうだったんですが、サーバーのメンテとか面倒だなぁと思っていました。さらにAPI Kitとか使ってiOSに組み込むというて結構時間かかるよなぁって思ってました。

超簡易なAPIをGoogleが提供しているFirebaseの機能の一部、Cloud Firestoreを使ってやる手順を紹介します。厳密にいうとCloud Firestoreの機能を使いまくったのでもはやAPI作ってもないです。

Cloud Firestoreってなに?

FirebaseにはRealtime DatabaseというDatabaseの仕組みが昔からあったんですが、それの新しいバージョンです。よりスケーラブルで汎用性の高いデータベースの仕組みみたいです。(何か言っているようで何も言っていない)

Realtime DatabaseもFirestoreもデータベースの仕組みなのですが、いわゆるリレーショナルなデータベースの仕組みというよりもアプリケーションなんかを作るのを前提としたデータベースになっています。各アプリケーションとサーバー間で非同期にデータを保持したりするのに向いています。

つまりどういうこと?っていうと、例えばアプリがオフラインの時でもある程度アプリにデータを溜めておいて、オンラインになった時に同期したり、オンラインの時は常に同期することでデータの送受信をリアルタイムに行ってチャットみたいなサービスができるような仕組みです。

2019年5月現在はベータ版で運用されていて制約等も色々あるようですが、今回の要件ではそこまで厳しく求めてないのでCloud Firestoreを使います。

どんなAPIを作りたかったのか?

画面上の「2018年5月12日の大垣と同じくらいの気温だよ。」とChakuyo-bakoが教えてくれる部分のAPIを作りたかったです。

これを実現するためには、サーバーに気温(28.9℃)をリクエストすると日付(2018/05/12)と場所(大垣)をレスポンスしてくれるAPIが必要です。

難しい認証も、POSTもPUTもいらない、ただただGETができる、そんなAPIが欲しかったんです。前述のリアルタイムに同期して〜みたいな機能もいらねーんです。

どうやって実現したか?

ざっくりいうとCloud Firestoreにデータをインポートする仕組みを作って、インポートしたらiPhoneからその値を見に行けるようにすればOKです。

データのインポート

まずはデータを集める必要があります。Chakuyo-bakoは気温・湿度・気圧を測ることができるので、この辺のデータがあるところがいいです。

今回の場合は気象庁ですね(端折る)。気象庁は大変よく出来たCSVをダウンロードさせてくれます(しかも商用利用も可能)。

地点をまとめてCSVダウンロードできるんですが、構造が僕の好みではなかったので一つずつ地点を選択してCSVをダウンロードしていきます。

こんな感じでCSVがダウンロード出来ます。色々な項目がダウンロードされますが、使うのはB列、F列、H列ですね。

ちなみに全地点にデータがあるとは限りません。主要都市はだいたい入ってるって感じですね。

Node.jsでインポートバッチを書く

Cloud Firestoreは無料プランでインポートする機構がなさそうなのでNode.jsでインポートのバッチを書きます。

Cloud Firestoreの構造的には、コレクションのなかにドキュメントがあってその中にコレクションがあるような構造になっています。この辺ベストプラクティスがわかってないんですがとりあえず第一階層のコレクションに環境データの種類(temperature/humidity/pressure)、第二階層のドキュメントは乱数を降って、第三階層に地点、日付、実際の値が入るような構造にします。第二階層のドキュメントの恩恵を受けてないんですが第三階層の値でWhere句とか使って条件指定できるのでまぁ問題ないです。

つまりこの構造で入れておくと、tempuratureから28.9℃の時のデータをちょうだい〜っていうリクエストを送ってその回答がもらえるようになるのです。

 

コードはこんな感じです。短いので全部貼っちゃいます。

 

最初にライブラリからCloud Firestoreにアクセスするための設定を色々と行わなければいけないので公式の手順に従ってJSONやら何やらを作ります。

このバッチ、使い方としてはこんな感じで使います。

node import.js [環境データの対応] [場所の日本語名] [csvの名前]

node import.js temperature 横浜 yokohama.csv

これを実行するとtemperatureコレクションに地点が「横浜」という名前でyokohama.csvの気温のデータがぶち込まれるわけですね〜〜!

もっとまとめられると思うんですけど、僕はちょっとずつデバッグしてやるのが好きなので手動の部分多くあります。

データの読み取り

iOS側での呼び出しはこんな感じで簡単に出来ます。若干Date型の取り扱いに迷いましたが仕組みとしてはCompletion handlerに普通に値が返ってくるパターンのやつです。

この辺を利用するには事前にFirebaseの設定を済ます必要があるのでcocoapods等でインストールしましょう。ここでも公式の手順がわかりやすいです。

おわりに

Cloud Firestoreのおかげで無事に前日にApp Store申請をだし、当日朝早くに申請が通り無事出展に間に合いました。

簡単なもはやRestfulでもないGET のAPIを作る時におすすめです。GET APIを作れるといろんなところにデータを吐き出せるから便利ですよね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です