kent備忘ログ

お仕事と趣味生活と

REST APIについて

Webアプリに限らず、今日のインターネット利用でほぼ無意識に利用されているHTTP通信、今回はそのHTTP通信を介して利用される「REST」な「API」について私なりに記事を書いてみたいと思います。

APIとは

APIとは自社サービスやその機能を第三者が再利用・拡張することができるようにしたインターフェースを指します。

  • これにより、自社サービスを元にした関連サービスの拡充が促進され、サービス自体の発展に繋がります。
  • 一方で第三者が自社のリソースを使用し易くなる為、リソースが圧迫される恐れがあります。この対策としては第三者のアクセスを一定的に制限するレートリミット対策が有効です。

このAPIをWebアプリ上で公開しているのが「Web API」になります。

RESTとは

RESTは「REpresentational State Transfer」の略で、分散型システムにおける設計ルールを定めたものです。

分散型システムというのは、サーバサイドにおけるwebの三層構造がよく例に挙げられ、

  • HTMLを生成するプレゼンテーション層
  • クライアントの要求や、データアクセスを相互に行うアプリケーション層
  • データの取得・管理を行うデータベース層

が相互に連携し合う中で、統一的な設計ルールを定めたものになります。

REST原則の中で特徴的なものは以下になります。

階層化システム
  • サーバサイド内の各システムの役割を決め独立させることで、各システムを効率よく使用することができる。
コードオンデマンド
  • クライアント側がサイトのコードをダウンロードして手持ちのローカル環境で実行できる事。これにより、サーバ側で新しいプログラムを随時構築することで、常に新しいコードをクライアント側へ提供可能。
統一インターフェース
  • URIで指定されたリソースへの操作を統一、動作を含まず限定的なインターフェースで実行可能。
ステートレス
  • 単一のリクエスト以外見る必要がなく、障害に強い。同時にリクエスト全体でサーバリソースを共有する必要がないので機能拡充が容易である事。
キャッシュ制御が可能
  • クライアント側に情報のキャッシュを持たせることにより、余分な通信が排除されリソースや拡張性が向上する。
上の原則を遵守して設計されたシステムをRESTfulなシステムといいます。このREST原則に沿って設計されたAPIが「REST API」と言えます。
REST原則沿った設計は、URIを使用したHTTP通信の中身であるHTTPリクエスト・HTTPレスポンスの内容を、統一された書き方で実装することにより実現されます。

URI設計

記述されたURIはリソースを表し、HTTPメソッドはそのリソースに対する操作を表します。
REST制約に沿ったURI・HTTPメソッドの例
  • リソースにmovieを指定し、HTTPメソッドを使用したCRUD操作例になります。
URI HTTP method
POST /movies POST
GET /movies/1 GET
PUT /movies/1 PUT
DELETE /movies/1 DELETE
REST設計では、URIの記述に重要なルールがあります。
  • URI自体は短く簡潔に
  • 単語の記述を省略形にしない
  • 全て小文字で記載すること
  • 単語同士を繋げる場合はアンダースコアではなく、ハイフンを使用すること
  • 単語は複数形を使用すること
  • (日本語のような)エンコードを必要とする文字列を使用しない
  • サーバ側のアーキテクチャ(使用プログラム言語の文法等)をURIに記述しない
  • クエリパラメータとパスパラメータの使い分け
    • クエリパラメータ(末尾にあるキーバリュー = 省略可能な場合に使用)
    • パスパラメータ(URI中に埋め込まれるパラメータ=一意なリソースを表す場合に使用)

また統一された設計ルールを使用するにより、実装時の間違いを防ぐことが容易になります。