RESTful APIとは何なのか？

RESTful APIは、**Representational State Transfer（REST）という原則に基づいて設計された**　API（Application Programming Interface）です。Webサービスを設計するためのアーキテクチャスタイルの一つであり、HTTPプロトコルを使用してリソースを操作するための一連の規則とガイドラインを提供します。

__API__ とは「Application Programming Interface」の略称で、複数のソフトウェアやWebサービスをつなぐ __窓口__ のような役割を持つ規格のことです。

「RESTful」は、RESTと「～を満たす」という意味の「ful」を組み合わせた用語です。__RESTに含まれている制約を満たすようなAPIが、RESTful APIと呼ばれます。__ 

RESTは、__分散型ハイパーメディアシステムにおけるソフトウェアアーキテクチャスタイルを定義__ しており、Webのようなシステム間でのやり取りを容易にすることを目的としています。
※__分散型ハイパーメディアシステム__ は、複数のネットワークノードに分散されたハイパーメディア（テキスト、画像、音声、ビデオなどのメディアを含む）コンテンツを管理、配信、アクセスするためのシステムです。このシステムは、インターネットやイントラネットなどのネットワークを介して、ユーザーが分散されたリソースにアクセスできるように設計されています。(文章最後に解説を追加)

![rest.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/653c246f-f5c4-9f07-f723-35de38f41522.png)

### RESTful APIの設計原則

#### 1. **データや機能がユニークな名称で管理される**
RESTful APIでは、すべてのデータや機能は「リソース」として表現されます。リソースは一意のURI（Uniform Resource Identifier）で識別されます。
例: `https://api.example.com/users/123` は、IDが123のユーザーリソースを表します。

すべての情報は、一意のリソースIDで識別されるべきです。このIDは、クライアントがリソースにアクセスするために使用されます。URIはリソースの場所を示すものであり、操作の種類を示すものではありません。

#### 2. **リソースのURIとHTTPメソッドの組み合わせで操作する**
クライアントとサーバー間のやり取りは、一貫した方法で操作されるべきです。具体的には、すべての操作は、HTTPメソッド（GET、POST、PUT、DELETEなど）とリソースのURIを使用して行われます。HTTPメソッドを使用してリソースを操作します。リソースの操作は、リソースのURIとHTTPメソッドの組み合わせで決定されます。

RESTful APIは、統一されたインターフェースを提供することを目指します。これにより、クライアントとサーバー間の相互運用性が向上します。

__HTTPメソッドを使用してリソースを操作__ 
**GET**: サーバーから情報を取得する
**POST**: サーバーにデータを送信する
**PUT**: サーバー上のリソースを更新、または作成する
**DELETE**: サーバー上のリソースを削除する
**PATCH**: サーバー上のリソースの部分更新
   
#### 3. **各リクエストは、独立した操作として処理されるので、サーバはやり取りを保存しない**
RESTful APIはステートレスであるべきです。つまり、各リクエストは独立しており、サーバーはクライアントの状態を保持しません。すべての必要な情報はリクエストに含まれている必要があります。

クライアントは、サーバーの状態を保存することなく、個々の要求でサーバーと対話できるべきです。サーバーは、クライアントとのやり取りの状態を保存しません。各リクエストは、独立した操作として処理されます。



#### 4. **ディレクトリ構造で整理されている**
リソースは、階層構造で整理されるべきです。クライアントはリソース間の関係を理解し、適切な操作を行うことができます。

リソースは、さまざまな形式（JSON、XML、HTMLなど）で表現されます。クライアントは、リクエストのヘッダーで希望する形式を指定できます。
（例: `Accept: application/json`）

:::note info
### 利点

**1.負荷分散が容易**
ステートレスな設計。リクエストは独立して処理されるため、負荷分散が容易。新しい機能や要件に合わせて簡単に拡張することができる。

**2.リソースの表現形式を選択できる**
リソースの表現形式を選択できるため、さまざまなクライアント（Webブラウザ、モバイルアプリケーションなど）に対応。

**3.エラーが発生しても、システム全体が停止することはない**
HTTPのキャッシュ機能を利用することで、リソースの取得を効率化し、パフォーマンスを向上させることができる。
:::

RESTful APIは、Webサービスやモバイルアプリケーションなど、さまざまなアプリケーション間でデータをやり取りするために広く使用されています。また、IoT（モノのインターネット）やソーシャルメディアなどの新しいアプリケーションにも採用されています。


__ソーシャルメディア__
Twitter、Facebook、InstagramなどのソーシャルメディアAPIは、RESTful APIを使用して、ユーザーデータや投稿にアクセスすることができます。
__Eコマース__
Amazon、楽天、Yahoo!ショッピングなどのEコマースAPIは、RESTful APIを使用して、商品情報、注文、顧客データなどにアクセスすることができます。
__地図サービス__
Google Maps、Bing Maps、Mapboxなどの地図サービスAPIは、RESTful APIを使用して、地図データ、経路検索、ジオコーディングなどにアクセスすることができます。

## 補足

### 分散型ハイパーメディアシステムの特徴

複数のネットワークノードに分散されたハイパーメディアコンテンツを管理、配信、アクセスするためのシステムです。高可用性、スケーラビリティ、パフォーマンス、耐障害性などの利点を提供し、インターネットやイントラネット上で広く利用されています


### 分散型ハイパーメディアシステムの例

#### 1. **World Wide Web (WWW)**
インターネット上の分散型ハイパーメディアシステムの代表例です。Webページは複数のサーバーに分散されており、ユーザーはブラウザを使用してこれらのページにアクセスします。

#### 2. **コンテンツデリバリーネットワーク (CDN)**
CDNは、コンテンツを複数の地理的に分散したサーバーにキャッシュし、ユーザーに最も近いサーバーからコンテンツを配信するシステムです。これにより、アクセス速度が向上し、トラフィックの負荷が分散されます。

#### 3. **分散型ファイルシステム**
分散型ファイルシステム（例：IPFS、HDFS）は、ファイルを複数のノードに分散して保存し、耐障害性とスケーラビリティを提供します。


#### ご参考になれば幸いです。


アプリケーション開発に集中するための方法を模索した
本記事はQmonus Value Streamの投稿キャンペーン記事です。