# Webを支える技術 第5部 Webサービスの設計① ## 第15章 読み取り専用Webサービスの設計 ### 15.1 リソース設計とは何か **リソース設計**とは、クライアントとサーバ間のインターフェースの設計、つまりWebサービスやWebAPIの**外部設計**である。 以下のような着眼点で、設計を行う。 * リソースの種類 * リソースの表現 * リソースの分割 * リソースの操作方法 * URIの設定 * リンクの設定 重要なのは、**WebサービスとWebAPIを分けて考えないこと!** どちらも**Web技術を使用**してリソースを取得するため、**両者を分ける必要がない。** ### 15.2 リソース指向アーキテクチャのアプローチ オブジェクト指向やRDBMSでは、それぞれに対応した設計方法が存在するが、リソース設計には、現段階で一般的な設計手法は存在しない。 指針として唯一存在するのが、リソース指向アーキテクチャの設計アプローチである。以下の7ステップからなる。 1. Webサービスで提供するデータを特定する。 2. データをリソースに分ける。 3. 各リソースにURIをつける。 4. クライアントに提供するリソース表現を設計する。 5. リンクとフォームを利用してリソースを結びつける。 6. イベントの標準的なコースを検討する。 7. エラーについて検討する。 #### リソース指向アーキテクチャの4つの性質 * **アドレス可能性**:URIさえあればリソースと一員をだす。 * **接続性**:ハイパーメディアとしてのWebの基幹である。 * **統一インターフェース**:HTTPメソッドをGET・POSTで調整する。 * **ステートレス性**:この性質にとらわれなければ、コスト削減につながる。 ### 15.3 例題:郵便番号検索サービスの設計 日本の郵便番号とその住所、住所の読みをもとに、郵便番号情報を検索できるサービスを例として取り上げる。 なお今回は、データは全て読み取り専用である。 ### 15.4 1. Webサービスで提供するデータを特定する。 サービスで提供するデータを特定する作業である。 自分のサービスがどのようなデータを提供するのかを理解する必要がある。 例題では日本郵便の公開データを利用している。 #### 15.5 2. データをリソースに分ける データのリソース分割を行う。**簡単そうに見えて大変難しい工程**である。 郵便番号取得の例題では、検索は機能であって情報ではない。 こうした**機能の結果をリソースと捉える**のが重要となってくる。 例題では以下の通りリソースを区別した。 * 郵便番号リソース:最小単位。住所・読み方 * 検索結果リソース:郵便番号や住所の一部で郵便番号を検索 * 地域リソース:都道府県や市区町村、町域のリソース。 * トップレベルリソース:このWebのスタート地点。 ### 15.6 3. リソースにURIで名前をつける * 郵便番号リソース:**URIは一意(ユニーク)な性質**のため、同じく一意な郵便番号を用いる。郵便番号の真ん中のハイフンは、利用してもしなくても良い。今回の場合、ハイフン無しを正規リソース、ハイフンありを代理リソースとしている。 * 検索結果リソース:**クエリパラメータによる検索条件の入力**を表す部分が必要である。クエリパラメータは/search?q=小石川のように、?の後にq=が続き、クライアントの入力内容が記述される。日本語は%エンコードされる。 * 地域リソース:日本語の住所表記に合わせて/で区切って表記。ディレクトリはエリアが小さくなるほど深くなる階層構造をなしている。 * トップレベルリソース:ルートディレクトリ部分となり、通常は**パス無しのURL**となる。 ### 15.7 4. クライアントに提供するリソース表現を設計する 各表現形式には得手不得手があるため、それぞれの性質に応じて作りたい内容に適したものを選択する。また、**1つのリソースが複数表現に対応する**形式であるとなお良い。 郵便番号検索の例の場合、マルチメディアは不要なため、シンプルなXMLと軽量フォーマットを選択している。 #### 15.7.1 XML表現 XMLは**独自フォーマットを作り出さない**指針を持つ。タグは自由に追加できるものの、フォーマットは原則として崩してはならない。 既存のフォーマットに不足分を独自タグで拡張する形がベストである。 主なフォーマットとしてXHTMLとAtomがあるが、今回はブラウザ表示のフォーマットやAtomで必須の著者・更新日時が無いという観点からXHTMLを選択している。 #### 15.7.2 軽量フォーマット表現 軽量フォーマットとは、JSONやYAML(リストやハッシュなどのデータ構造を簡単に表現するためのテキストフォーマット)、CSV(データを表形式で表したフォーマット。Excelと互換性あり)等がある。 今回はJavaScript利用を見越し、JSONPを用いたクロスドメイン通信を行うことを計画しているため、JSONを選択している。 #### 15.7.3 URIで表現を指定する XHTMLの場合は.html、JSONの場合は.jsonの拡張子をつける。 また、JSONPでコールバック関数を渡したい時は、.json?callback={コールバック関数名}とする。 検索結果リソースは、拡張子ではなくクエリパラメータtypeを利用し、それぞれ=htmlや=jsonで文字表現を指定している。 ### 15.8 5. リンクとフォームを利用して、リソース同士を結びつける 設計したリソース同士をリンクで接続する。Web上に存在するリソースにはリンクが不可欠である。 #### 15.8.1 検索結果リソース * 検索結果リソース→郵便番号リソースのリンク 検索結果に対応した各郵便番号リソースへ向けたリンクを設定する。 htmlはhref属性、JSONはlinkメンバに設定する。 * 検索結果表示画面の遷移リンク 上限10件の郵便番号を表示するため、10件を上回る検索結果の場合、次(前)のページへと遷移するリンクが必要となる。 JSONではnextメンバに遷移リンクが表示されている。 #### 15.8.2 地域リソース * 地域リソース→郵便番号リソースへのリンク * 地域リソース→下位の地域リソースへのリンク 表現方法は検索結果リソースと同様。 #### 15.8.3 郵便番号リソース * 郵便番号リソース→上位の地域リソースへのリンク 郵便番号が最終目的であるため、ここからリンクするものは一見無いようにおもえるが、その郵便番号の上位の地域リソースを入れておくと、別のアプリケーション状態に遷移できる。 #### 15.8.4 トップレベルリソース トップレベルリソースのみは、Webサービスが提供するリソースへのリンクを表す。JSON形式が存在せず、XHTML形式のみである。 * トップレベルリソース→都道府県一覧へのリンク * 検索結果を生成するフォーム ### 15.9 6. イベントの標準的なコースを選択する #### 15.9.1 郵便番号の検索コース 1. 郵便番号を入力 2. 検索結果リソースを取得 3. 目的の郵便番号リソースを取得 #### 15.9.2 住所から郵便番号を検索するコース 1. 住所を入力 2. 検索結果リソースを取得(適宜ページをめくる) 3. 目的の郵便番号リソースを取得 #### 15.9.3 地域リソースの階層をたどりながら郵便番号を選択するコース 1. 都道府県リソースを選択し、市区町村一覧を表示 2. 市区町村リソースを選択し、町域一覧を表示 3. 町域リソースを選択し、郵便番号一覧を表示 4. 目的の郵便番号リソースを取得 なお、ステートレスのため、URIを直接入力するとリソースを得られる。 ### 15.10 7. エラーについて検討する * 存在しないURIを指定する→404 Not Found * 必須パラメータを指定していない→400 Bad Request * サポートしないメソッド(GET, HEAD以外)を使用した→405 Method Not Allowed ###### tags: `読書`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up