ストリーミング寺子屋

音声・動画のストリーミング機能を
開発するエンジニアのための
実践的なナレッジベース

【開発環境ほか 1-7】RESTful APIについて教えて下さい。

定義

  • RESTful API
    RESTの指針となる原則と制約に従い、Webサービスと対話/やり取り/情報交換を可能にする インターフェースのこと。REST APIとも言います。
  • REST
    REpresentational State Transferの略。指針となる原則と制約がある、分散型ハイパーメディアシステムのアーキテクチャです。

準拠が必要な基準

RESTfulは、以下の基準に準拠する必要があります。

  • クライアントとサーバー
    クライアントとサーバーのコンポーネントは明確に定義され、分離されるます。分離されることによって、それぞれのコンポーネントが単純化し、独立してコンポーネントが進化できます。
    • API実装時:HTTPではクライアントで発生したエラーとサーバーで発生したエラーを、エラーコードで区別する必要があります。
  • ステートレス
    クライアントからサーバーへのそれぞれのリクエストは、リクエストを理解するために必要なすべての情報を含まなければなりません。
    サーバに保存されているコンテキストは利用できず、セッションの状態は完全にクライアント側に保持されます。リクエスト間で状態を保持する必要がないため、リソースを素早く解放でき、さらに実装を簡略化することもできるため、スケーラビリティが向上します。
    • API実装時:クライアントの認証情報、認証結果を保持しないため、要求毎に認証情報がないとエラーで返す実装が必要になります。
  • キャッシュ制約
    クライアントのリクエストに対するレスポンスをラベル付けし、その後の同じリクエストにレスポンスを再利用できる権利が与えられます。
    キャッシュ制約があることでネットワーク効率を向上させることができます。一部のやり取りの待ち時間を短縮でき、スケーラビリティとユーザーが感じる性能を向上させます。
    •  API実装時:キャッシュとしてはすべてのデータを保持する必要はありません。例えば、複数のデータを持っている場合、変更の少ない項目はキャッシュとして保持し、変更が多い項目は、都度、必要に応じて取得する方が効率が良いです。データを長期間保持しているとキャッシュが一杯になってしまう可能性があるので、データの有効期限を設定し、短期間でキャッシュ を削除したり、期限切れにならないように有効期限を伸ばしたり設定する必要があります。
  • 統一されたインターフェイス
    コンポーネント間で統一されたインターフェイスの要件を満たすこと。
    •  リクエストはリソースを特定するURI(Uniform Resource Identifier)を使用する。
    • クライアントはリソースを変更または削除できる情報を受け取り、リソースを操作できる。
    • クライアントはリソースを最適に使用するためのメタデータを含む自己記述型メッセージを受け取る。
    • クライアントはリソースにアクセス後、ハイパーテキスト/ハイパーメディアが使用できる。
    • API実装時:RESTful APIで実装するHTTPメソッドは複数回要求しても結果が変わらない、べき等である必要があります。例えばPUTやDELETEを複数回要求しても「リソースの内容が更新されている」「リソースが削除されている」などの同じ結果が得られますが、POSTを複数回要求するとその回数だけリソースに内容が追加されていき、べき等ではありません。
  • レイヤードシステム
    各コンポーネントが相互作用している直近のレイヤーを越えて「見る」ことができないように、コンポーネントの動作を制約し、アーキテクチャを階層的なレイヤーで構成することを可能にします。
    使用頻度の低い機能を中間層に移動させることや、情報を1つの層に限定することでシステム全体の複雑さを抑えることができます。中間層は、複数のネットワークやプロセッサにまたがるサービスの負荷を分散でき、システムのスケーラビリティを向上させます。
    •  API実装時:以下のようなレイヤー構成の場合、data base上でエラーが発生するとレイヤーを介してapiレイヤーがHTTP 404などのエラーを返します。
      api → domain service → authorization / database → entities
  • コードオンデマンド
    アプレットやスクリプトの形でコードをダウンロードして実行することで、クライアントの機能を拡張できます。事前に実装する必要ある機能を減らし、クライアントを簡略化することができます。システムの拡張性を高めることができますが、可視性が低下するため、RESTでは任意のオプションになっています。
    • API実装時:ディレクトリへの書き込みを可能性にしたり、特定のコンテンツはファイヤーウォールを越えることができるような実装にするなど。

Q&A

製品情報