構成
1章 Web APIとは何か
2章 エンドポイントの設計とリクエストの形式
3章 レスポンスデータの設計
4章 HTTPの仕様を最大限利用する
5章 設計変更をしやすいWeb APIを作る
6章 堅牢なWeb APIを作る
感想
基礎的な用語から解説がなされていたので、1つずつ理解しながら読み進められてよかったです。
TwitterやGitHubなど、世のサービスはどうなっているかが例に挙げられていて、面白みを感じながら読み進めることができました。
また「なぜデファクトスタンダードに寄せるのが良いのか」みたいなところから、それがどうして良いのかの根拠を言語化して示してくれていたので、自分の知識として活用できそうでした。
実際に以前プロジェクトの中で追加したAPIと同じパスが例に出てきて、その時は先方のエンジニアが提案してくださってその名前になったのですが、デファクトスタンダードになっていたのだなあと改めて思いました。
(この本もその方が薦めてくださったもの)
学んだメモ
- Web APIは簡単にいえば「HTMLの代わりにプログラムがより処理しやすいデータ形式を返すWebページの一種」
- APIエコノミー
- Web APIを公開することで外部サービスとの連携を容易にして新たな価値が生まれ、サービスやビジネスが発展していくこと
- サードパーティJavaScript
- スマートフォンアプリケーションにおいてサーバとクライアントを繋ぎこむWeb APIについて、モバイルアプリケーションでは一度インストールされたらアップデートされるまで古いコードが動作を続けてしまうので、APIのアップデートなどを戦略的に行う必要がある。
- (「スマートフォンアプリの旧バージョンがこのコード使ってるから変えられない」みたいなのあったなあ💭)
- Web APIを美しく設計するには
- 仕様が決まっているものに関しては仕様に従う
- そうでないものはデファクトスタンダードに従う
- メリット:他のAPIを利用してきた開発者が利用方法を類推しやすくなったり、既存のクライアントライブラリの流用が可能になるなど
エンドポイント設計
- 改造しやすいHackableなURIは望ましい
- e.g.
v1/items/123
- 「このアイテムのIDが123だな」と予想できる。またこの数字を変えると別アイテムにアクセスできると予想できる
- applicaiton/x-www-form-urlencoded以外の形式で送ることができないデメリット
- e.g.
- URIで単語をつなげる必要がある場合はハイフンかアンスコか
- 1スクリーン1APIコール、1セーブ1APIコール
- HATEOAS
{ "friends": [ { "name": "Taro", "link": { "uri": "https://hogehoge", "rel": "user/detail" } ] }
- REST LEVEL3 API
レスポンスデータの設計
- データフォーマットはJSONがデファクトスタンダード
- JSONP ( JSON with padding )
- JSONをラップするJSを付け加えたもの
- JSONはトップレベルに配列ではなくオブジェクトを置く方が好ましい
- 巨大な数値は文字列で返す
- IDなど巨大な数を扱うとき、数値をそのままJSONとして返してしまうと問題が起こる可能性がある。これを回避するには、数値ではなく文字列で返す方法がある。
- エラーレスポンス
HTTPを最大限利用する
- プロキシサーバ
- クライアントとサーバの間に位置してやり取りを仲介する。キャッシュの情報を扱ったり
- Content-Type
- クライアントの多くはContent-Typeの値を使ってデータ形式をまずは判断するので、正しくデータを読み出せるよう適切なメディアタイプを指定しよう
- 同一生成元ポリシー ( Same Origin Policy )
- XHTTPRequstでは、異なるドメインに対してアクセスを行って、レスポンスデータを読み込むことができない。
- CORS ( クロスオリジンリソース共有 )
設計変更しやすいWeb APIをつくる
- APIの変更は難しい。ではどうするか→
- 新しいものを提供する
- 新しいものはパスでそのことがわかるようにする(v1/, v2.0/ etc.)
- バージョン管理
- 提供終了時の対応
- 継続的な告知、Blackout Test
- あらかじめ提供終了時の使用を盛り込む
- 410と公開が終了した旨のメッセージを返すなど
堅牢なWeb APIを作る
- HTTPSを使えばほとんどの攻撃は防げるが100%ではない
- XSS
- ユーザーの入力を受け取ってそれをページのHTMLに埋め込んで表示する際に、JSなどを実行できてしまうというもの。セッションクッキーetc.ブラウザに保持された情報にアクセスできたり、同一生成元ポリシーの制限を受けずにサーバにもアクセスできる
- ユーザーからの入力はそれがどう使われるかに関わらずチェックしましょう
- XSRF
- JSONハイジャック
- 大量アクセスへの対策
- 各ユーザーごとのレートリミット(最大アクセス回数/単位時間)を決める
- サービスの性質に合わせて良い感じにできると良さそう
- 単位時間、現在公開されているAPIを見ると1時間くらいが多いらしい
- 制限を超えた時は429と制限内容を返すと良さそう