REST API(Representational State Transfer アプリケーション プログラミング インターフェース)は、ウェブを支えるネットワーク アプリケーションの設計と構築の標準として一般的に認識されているアーキテクチャ スタイルです。REST は、一連のルールと制約を提供します。これらに従うことで、シンプルでスケーラブルかつ簡単に統合できるウェブサービスが実現します。
REST API は、REST アーキテクチャ スタイルの設計原則に準拠した API です。REST の中心となるのはリソースという概念です。リソースは、ユーザー、商品、ドキュメント、アイテムのコレクションなど、あらゆる情報です。
REST API は、クライアント アプリケーションが事前定義された一連のステートレス オペレーションを使用してこれらのリソースにアクセスし、操作する方法を提供します。
クライアント アプリケーション(モバイルアプリ、ウェブブラウザ、別のサーバーなど)が、アクションを実行するために API へのリクエストを開始します。このリクエストは特定の URL に送信され、HTTP メソッド、メタデータを含むヘッダー、場合によってはデータを含むリクエストの本文が含まれます。
サーバーはリクエストを受信して検証し、クライアントが認証され、リクエストされたアクションを実行する権限があることを確認します。その後、リクエストを処理します。これには、データベースからのデータの取得、新しいリソースの作成、既存のリソースの更新などが含まれます。
リクエストを処理した後、サーバーはレスポンスをクライアントに返します。このレスポンスには、結果を示す HTTP ステータス コード(成功の場合は 200 OK、リソースが存在しない場合は 404 Not Found、セキュリティ上の問題がある場合は 401 Unauthorized など)と、リクエストされたデータがレスポンスの本文に含まれます。
クライアントとサーバー間で転送されるデータは、リソースの状態の「表現」です。JSON(JavaScript Object Notation)は、軽量で人間が読める形式であり、プログラミング言語で簡単に解析できるため、このデータの最も一般的な形式となっています。
REST の能力とスケーラビリティは、その設計を導く一連のアーキテクチャ上の制約から生まれます。これらの制約に従うシステムは「RESTful」とみなされます。
リソースは REST の基本的な概念です。リソースは、型、関連データ、他のリソースとの関係、およびリソースに対して動作する一連のメソッドを持つオブジェクトです。たとえば、e コマース API では、「商品」や「顧客」がリソースになります。
各リソースは URI によって一意に識別されます。適切に設計された API は、リソースを識別するために、明確で説明的かつ一貫性のある URI を使用します。たとえば、/users はユーザーのコレクションを識別し、/users/123 は ID が 123 の特定のユーザーを識別します。
クライアントはリソースと直接やり取りするのではなく、そのリソースの表現とやり取りします。最も一般的な表現形式は JSON ですが、XML や HTML などの形式も使用できます。これにより、リソースの状態を柔軟に表現できます。
クライアントからサーバーへのリクエストには、サーバーがリクエストを理解して処理するために必要なすべての情報が含まれている必要があります。サーバーは、リクエスト間でクライアント コンテキストやセッション状態を保存しません。この制約により、どのサーバーでもリクエストを処理できるため、REST API は非常にスケーラブルになります。
クライアントとサーバーは分離されており、API が両者のインターフェースとして機能します。このように関心を分離することで、クライアントサイド アプリケーションとサーバーサイド アプリケーションを個別に進化させることができます。
REST では、クライアントとサーバー間で一貫した統一インターフェースが必要です。これは、標準の HTTP メソッド、リソース識別用の URI、アプリケーション状態のエンジンとしてのハイパーメディア(HATEOAS)を使用することで実現されます。
サーバーからのレスポンスは、キャッシュ可能またはキャッシュ不可として定義する必要があります。レスポンスがキャッシュ可能である場合、クライアントまたは仲介者は、後続の同一のリクエストに対してそのレスポンスを再利用できます。これにより、パフォーマンスが大幅に向上し、サーバーの負荷が軽減されます。
REST API に接続されたクライアントは通常、エンドサーバーに直接接続されているか、途中の仲介者に接続されているかを判別できません。API ゲートウェイやロードバランサなどの仲介サーバーをアーキテクチャに導入して、スケーラビリティ、セキュリティ、パフォーマンスを向上させることができます。
URI はリソースを表すため、動詞ではなく名詞(コレクションの場合は複数形、特定のアイテムの場合は単数形または ID)を使用する必要があります。たとえば、すべてのユーザーを表すには /getAllUsers ではなく /users を使用します。
標準の HTTP 動詞を使用してアクションを表します。GET は取得、POST は作成、PUT は更新、DELETE は削除です。これにより、予測可能で一貫性のあるインターフェースが作成されます。
REST の重要な原則は、レスポンスに他の関連するアクションやリソースへのリンクを含める必要があることです。これにより、クライアントは URI パターンをハードコードすることなく、API を動的にナビゲートできます。
API に互換性に影響する変更を加える必要がある場合は、新しいバージョンを導入します。最も一般的な方法は、/api/v2/users のように、URI にバージョン番号を含めることです。これにより、既存のクライアントは古いバージョンを使い続けることができ、新しいクライアントは新しいバージョンを採用できます。
リクエストが失敗した場合は、適切な HTTP ステータス コード(400 Bad Request、500 Internal Server Error など)とともに、明確で有用なエラー メッセージをレスポンスの本文に含めます。これにより、クライアントサイドのデベロッパーは問題の原因を把握できます。
クライアントの ID と認可を検証する堅牢な認証(OAuth 2.0、API キーなど)を実装して API を保護し、クライアントがアクセスを許可されたリソースにのみアクセスできるようにします。トラフィックの暗号化には常に TLS/SSL を使用します。
多数のアイテムを返すことができるエンドポイントの場合は、ページネーションを実装して、管理可能なチャンクでデータを返します。また、クライアントが結果をフィルタして並べ替えられるようにクエリ パラメータを提供することで、転送されるデータ量を減らします。
シンプルさと読みやすさ
REST API は標準の HTTP メソッドと人が読める URI を使用するため、デベロッパーは比較的簡単に学習、使用、デバッグできます。インターフェースが自己記述型であるため、統合作業が簡素化されます。
スケーラビリティ
REST のステートレスな性質は、スケーラビリティを実現する重要な要素です。サーバーはクライアント セッションを維持する必要がないため、複数のサーバーにリクエストを簡単に分散できます。また、負荷が増加した場合でも、複雑な作業なしで新しいサーバーを追加して対応できます。
柔軟性
REST はさまざまなデータ形式をサポートしており、JSON は軽量で幅広くサポートされているため最も人気があります。この柔軟性により、REST API はウェブブラウザからモバイル デバイス、IoT センサーまで、幅広いクライアント アプリケーションで使用できます。
クライアントとサーバーの分離
REST によって強制されるクライアント サーバー アーキテクチャにより、関心の分離が明確になります。これにより、デベロッパーはクライアントサイドのフロントエンドとサーバーサイドのバックエンドを個別に作業できるため、開発サイクルを加速できます。
言語に依存しない
REST は標準の HTTP を基に構築されたアーキテクチャ スタイルであるため、任意のプログラミング言語で実装でき、HTTP リクエストを作成できる任意のクライアントで使用できます。これにより、多様な技術スタック間での相互運用性が最大限に高まります。
一般的なユースケースとして、モバイル天気アプリが特定の場所の現在の天気を公開天気 API から取得する場合があります。
クライアント アプリケーションは、API エンドポイントに HTTP GET リクエストを送信します。このリクエストには、場所と認証用の API キーが含まれます。
curl "https://api.weather-service.com/v1/current?location=94043&key=YOUR_API_KEY" |
curl
"https://api.weather-service.com/v1/current?location=94043&key=YOUR_API_KEY"
サーバーはリクエストを処理し、指定された場所の天気データを取得して、JSON レスポンスを返します。
{ "temperature": 20, "unit": "celsius", "condition": "Clear", "humidity": 55 } |
{
"temperature": 20,
"unit": "celsius",
"condition": "Clear",
"humidity": 55
}
マイクロサービス アーキテクチャでは、「商品」サービスが「在庫」サービスから最新の価格を取得してから、e コマースサイトに表示する必要がある場合があります。
商品サービスは、特定の商品 ID について、在庫サービスの API エンドポイントに内部 HTTP GET リクエストを行います。
curl "http://inventory-service.internal/api/products/PN-5821/price" |
curl
"http://inventory-service.internal/api/products/PN-5821/price"
在庫サービスは現在の価格を検索し、単純な JSON レスポンスを返します。
{ "productId": "PN-5821", "price": 1299.99, "currency": "USD" } ``` |
{
"productId": "PN-5821",
"price": 1299.99,
"currency": "USD"
}
```