2017年 秋期 応用情報技術者試験 問4
WebAPIの設計
S社は,家庭向けの体重計,血圧計,活動量計などの健康機器を製造販売している会社である。競合する他社との差別化を図るために,クラウドサービスを使った健康管理サービス(以下,本サービスという)の提供を検討している。例えば,健康機器で計測したデータ(以下,計測データという)を本サービスで管理して,スマートフォン(以下,スマホという)のアプリケーションプログラム(以下,アプリという)で計測データを確認できるようにすることを考えている。開発部のT君を中心に,本サービスを設計することになった。
T君は,本サービスのアーキテクチャを検討し,クラウドサービス上に健康機器やアプリから呼ばれるWebAPIを用意し,そのWebAPIを介して,計測データのアップロードや確認を行う方式を採用することにした。
【本サービスの前提】
T君は,本サービスの全体を図1のように構成し,前提を次のように考えた。
- 健康機器は,表示用のディスプレイ,インターネットにアクセスするための無線LAN(以下,Wi-Fiという),スマホと通信するためのBluetooth機能を装備する。
- 家庭内はWi-Fiルータでインターネットにアクセスできる環境とする。
- 計測時には,健康機器はスマホを介することなく,Wi-Fi経由で本サービスにアクセスする。
【本サービスのユースケース】
T君は,WebAPIの満たすべき要件を明らかにするために,本サービスのユースケースを洗い出し,表1のように整理した。また,本サービスで使用するデータベースの主なテーブルを表2のように定義した。
ユースケース名 | ユースケースシナリオ |
---|---|
ユーザの登録 | ・利用者は,アプリの"ユーザ登録"画面で,登録する利用者の愛称(アプリや健康機器で利用者を識別するためのもの)とメールアドレスを入力する。 ・アプリは,愛称とメールアドレスを"ユーザ登録"WebAPIに渡す。 ・WebAPIは,ユーザIDとパスワードを生成して"ユーザ"テーブルに追加し,ユーザIDとパスワードをアプリに返す。 ・アプリは,愛称,メールアドレス,ユーザID,パスワードをスマホ内に保存する。 |
健康機器のWi-Fi設定 | ・利用者は,スマホと健康機器をBluetoothで接続して,アプリの"健康機器Wi-Fi設定"画面で,利用するSSIDを選択し,対応する暗号化キーを入力する。 ・アプリは,SSIDと暗号化キーを健康機器に送る。 ・健康機器は,受け取ったSSIDと暗号化キーを保存し,Wi-Fiに接続する。 |
健康機器へのユーザの登録 | ・利用者は,スマホと健康機器をBluetoothで接続して,アプリの"健康機器ユーザ登録"画面で,登録する利用者の愛称を選択する。 ・アプリは,①必要なユーザ情報を健康機器に送る。 ・健康機器は,受け取ったユーザ情報で"ユーザ参照"WebAPIを呼び,そのユーザが登録されていることが確認できたら,アプリから受け取ったユーザ情報を健康機器内に保存する。 |
計測 | ・利用者は,健康機器で計測する。ディスプレイに表示される愛称を確認して,計測対象者を選択する。(具体的な選択方法は,各健康機器によって異なる。) ・健康機器は,計測した1件分の計測値種別,計測日時,計測値を"計測データ登録"WebAPIに渡す。計測値種別とは,体重,血圧,活動量などの計測値の種別を表す。 ・WebAPIは,渡されたデータを"計測データ"テーブルに追加して,メールアドレス宛にメールを送信する。 |
計測データの参照 | ・利用者は,アプリの"計測データ参照"画面で,参照するユーザの愛称を選択する。 ・アプリは,"計測データ参照"WebAPIを呼ぶ。 ・WebAPIは,"計測データ"テーブルを参照し,対象となるデータをアプリに返す。 ・アプリは,計測データをグラフなどで見やすくして表示する。 |
ユーザの削除 | ・利用者は,アプリの"ユーザ削除"画面で,削除するユーザの愛称を選択する。 ・アプリは,"ユーザ削除"WebAPIを呼ぶ。 ・WebAPIは,"ユーザ"テーブルと"計測データ"テーブル内の対象行を削除する。 ・アプリは,スマホ内に保存した削除対象ユーザの情報を削除する。 ・アプリは,健康機器に,健康機器内に保存した削除対象ユーザの情報を削除させる。 |
テーブル名 | 列名 |
---|---|
ユーザ | ユーザID,パスワード,愛称,メールアドレス,登録日時 |
計測データ | ユーザID,計測値種別,計測日時,計測値 |
【WebAPIの設計方針】
T君は,最近のWebAPIの技術動向を調査,検討した結果,本サービスのWebAPIはREST(REpresentational State Transfer)形式を採用することとし,設計方針を次のように決めた。
- WebAPIへのアクセスは,すべてHTTPSを用いて行う。
- アクセス対象への CRUD(Create,Read,Update,Delete)の操作を,それぞれHTTPメソッドのPOST,GET,PUT,DELETEで提供する。
- URIは,次の(1)~(5)に従って設計する。
(1) "api.example.co.jp"のように,APIであることが一目で分かるようにする。
(2) APIのバージョン番号を含める。
(3) deleteUserのようにリソースに対する操作を動詞を用いて表現するのではなく,usersのように対象とするリソースを複数形の名詞で表現し,操作はHTTPメソッドで指定する。
(4) アプリケーションや言語に依存する拡張子は含めない。
(5) リソースの関係性が一目で分かるようにする。
-
すべてのWebAPIでユーザ認証を行う。②ユーザ認証は,HTTPリクエストヘッダのX-Authorizationヘッダフィールドで,"ユーザID:パスワード"をBASE64エンコードしたものを設定する方式とし,設定された"ユーザID:パスワード"が"ユーザ"テーブルに存在することを確認する。"ユーザ登録"WebAPIを呼ぶ際は,ユーザIDが決まっていないので,ユーザ登録用に特別に用意したユーザIDでユーザ認証を行う。
-
WebAPIの実行結果のステータスは,標準的なHTTPステータスを使用する。
- 200:OK
- 400:不正なパラメタ
- 401:認証失敗
- 404:データが存在しない
-
リクエストとレスポンスのボディ部のフォーマットはJSON,文字コードはUTF-8を使用する。
設計方針に従ってWebAPIを設計した。URIテンプレートは,
https://api.example.co.jp/{version}/users/{userId}/{valueType}
とし,{version}はバージョン番号,{userId}はユーザID,{valueType}は計測値種別を必要に応じて指定する。
S社は,本サービスを利用する最初の健康機器として,体重計を発売することにした。体重計で利用するWebAPIでは,バージョン番号はv1,計測値種別はweightsとした。体重計で利用するWebAPIを表3に示す。
API名 | URI | HTTPメソッド | リクエストのボディ部 | レスポンスのボディ部 |
---|---|---|---|---|
ユーザ登録 | (略) | POST | 愛称,メールアドレス | ユーザID,パスワード |
ユーザ参照 | b | GET | f | 愛称,メールアドレス |
ユーザ削除 | (略) | d | - | - |
a | (略) | POST | g | - |
計測データ参照 | c | e | - | {計測日時,計測値}の配列 |