Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゼミ内LT「Web API: The Good Parts」 を読みました - I read ...

Haruki Tazoe
June 10, 2022
47

ゼミ内LT「Web API: The Good Parts」 を読みました - I read "Web API: The Good Parts".

Haruki Tazoe

June 10, 2022
Tweet

Transcript

  1. Web API: The Good Parts Web APIの設計、開発、運⽤についての解説書。 APIは設計次第で使いづらいものになってしまうだ けでなく公開後の保守運⽤も難しくなってしまいま す。そのためAPIを美しく設計することがとても重

    要です。本書では「設計の美しいAPIは、使いやす い、変更しやすい、頑強である、恥ずかしくない」 という考えのもと、APIをどのように設計し運⽤す ればより効果的なのか、ありがちな罠や落とし⽳を 避けるにはどういう点に気をつけなければいけない のかを明らかにします。 3
  2. Web APIとはなにか • HTTPプロトコルを利⽤してネットワーク越しに呼び出すAPI • APIとは“Application Programming Interface” • Web

    APIを美しく設計する重要性 • 設計の美しいWeb APIは使いやすい • 設計の美しいWeb APIは変更しやすい • 設計の美しいWeb APIは頑強である • 設計の美しいWeb APIは(開発者からの⽬線に対して)恥ずかしく ない 6
  3. Web APIとはなにか 対象となる開発者の数とAPIの設計思想 • LSUDs(large set of unknown developers): パブリックにドキュメントを公開し,誰でも登録して使⽤で

    きるため,誰が使うか分からない さまざまなユースケースを想定してなるべく広く汎⽤的にし なければならない • SSKDs(small set of known developers): ⾃社のスマートフォンクライアント向けのAPIなど,APIを利 ⽤する開発者が限られる 特定の開発者やその先に存在するエンドユーザーにとって便 利で使いやすいものでなくてはならない 7
  4. エンドポイントの設計とリクエストの形 式 • APIのエンドポイントはURIであるから,覚えやすく,どんな 機能を持つURIなのかが⼀⽬でわかるようなURIにする必要が ある • 短く⼊⼒しやすいURI • ⼈間が読んで理解できるURI

    • ⼤⽂字⼩⽂字が混在していないURI • 改造しやすい(Hackableな)URI • APIのURIが何を⾏いたいのかすぐに考えることができれば, ドキュメントをみなくても開発に注⼒することが可能となる 9
  5. エンドポイントの設計とリクエストの形 式 • サーバ側のアーキテクチャが反映されていないURI • http://api.example.com/cgi-bin/get_user.php?user=100 • PHPで書かれていてCGIで動作していることがURIから推測す ることが出来,セキュリティ的にもよろしくない •

    ルールが統⼀されたURI • ユニークな情報を取得するためのAPIに対して,クエリパラ メータにユニークIDを含めてGETするか,パスにユニークID を含めてGETするかのルールを統⼀するべきである 10
  6. レスポンスデータの設計 • データの内部構造をそのAPIを利⽤する際に応じて考える • IDのみを含めたJSONを返す • IDを含めた個⼈の情報を返す • IDに付属する情報をクエリパラメータを使⽤し,レスポンス データとして返す⽅法もある

    • JSONデータの返し⽅には階層的に返す場合とフラットに返す 場合があり,階層構造で返す場合はJSONのデータサイズが⼤ きくなってしまうため,不要な階層化は避ける 12
  7. HTTPの仕様を最⼤限利⽤する • プロキシサーバがオリジンサーバでは変わってしまった情報 を返してしまうことを防ぐ⽅法 • 期限切れモデル: キャッシュの期限が切れたら再度アクセスして情報を取得す る しばらく情報に変動がない者に対して有効である •

    検証モデル: 今保持しているキャッシュが最新であるかどうか問い合わせ て,更新されている場合のみ取得を⾏う 情報が常に変動する可能性がある者に対して有効である 14
  8. HTTPの仕様を最⼤限利⽤する • クロスオリジンリソース共有(CORS:Cross-Origin Resource Sharing) • リクエスト側でOriginヘッダにアクセス元を指定し,サーバ側 で許可できる⽣成元であればアクセスを許可し,そうでなけ れば403エラーを返す •

    セキュリティ上,どこから読まれても問題ない場合は Access-Control-Allow-Origin ヘッダに * を指定すると,どこ からでも読み込めることを明⽰することが可能に • 例:GitHubなど 15