応用情報技術者試験 過去問 2017年(平成29年) 秋期 午後 問4
WebAPIの設計
S社は,家庭向けの体重計,血圧計,活動量計などの健康機器を製造販売している会社である。競合する他社との差別化を図るために,クラウドサービスを使った健康管理サービス(以下,本サービスという)の提供を検討している。例えば,健康機器で計測したデータ(以下,計測データという)を本サービスで管理して,スマートフォン(以下,スマホという)のアプリケーションプログラム(以下,アプリという)で計測データを確認できるようにすることを考えている。開発部のT君を中心に,本サービスを設計することになった。
T君は,本サービスのアーキテクチャを検討し,クラウドサービス上に健康機器やアプリから呼ばれるWebAPIを用意し,そのWebAPIを介して,計測データのアップロードや確認を行う方式を採用することにした。
【本サービスの前提】
T君は,本サービスの全体を図1のように構成し,前提を次のように考えた。

- 健康機器は,表示用のディスプレイ,インターネットにアクセスするための無線LAN(以下,Wi-Fiという),スマホと通信するためのBluetooth機能を装備する。
- 家庭内はWi-Fiルータでインターネットにアクセスできる環境とする。
- 計測時には,健康機器はスマホを介することなく,Wi-Fi経由で本サービスにアクセスする。
【本サービスのユースケース】
T君は,WebAPIの満たすべき要件を明らかにするために,本サービスのユースケースを洗い出し,表1のように整理した。また,本サービスで使用するデータベースの主なテーブルを表2のように定義した。
ユースケース名 | ユースケースシナリオ |
---|---|
ユーザの登録 |
|
健康機器のWi-Fi設定 |
|
健康機器へのユーザの登録 |
|
計測 |
|
計測データの参照 |
|
ユーザの削除 |
|
テーブル名 | 列名 |
---|---|
ユーザ | ユーザ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)に従って設計する。
- "api.example.co.jp"のように,APIであることが一目で分かるようにする。
- APIのバージョン番号を含める。
- deleteUserのようにリソースに対する操作を動詞を用いて表現するのではなく,usersのように対象とするリソースを複数形の名詞で表現し,操作はHTTPメソッドで指定する。
- アプリケーションや言語に依存する拡張子は含めない。
- リソースの関係性が一目で分かるようにする。
- すべての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 | - | {計測日時,計測値}の配列 |