RESTful API (Flutter Roadmap RESTful APIs)

## はじめに
Flutterを網羅的に学習するにあたって[Roadmap](https://roadmap.sh/flutter)を使って学習を進めることにしました。

この記事では、Flutter初学者やこれからFlutterを学習し始める方に向けて、**RESTful API**についてまとめています。

RoadmapはFlutterだけでなく、他の言語やスキルのロードマップも提供されており、何から学習して良いか分からないと悩んでいる方にとって有用なサイトになっています。
ぜひ[Roadmap](https://roadmap.sh/)を利用して学習してみてください。

## Roadmapとは

簡潔に言えば、Roadmap.shは学習者にとっての**ガイドブック**であり、**学習の方向性を提供する学習ロードマップサイト**です。

初心者から上級者まで、ステップバイステップでスキルを習得するための情報が提供されています。

学習の進め方が分かりやすく示されているだけでなく、個々の項目に参考資料やリソースへのリンクも提供されているので、学習者は目標を設定し、自分自身のペースで学習を進めることができます。

## RESTful APIs
FlutterロードマップRESTful APIsでは以下の4つのサイトが紹介されています。興味のある方はぜひお読みください。

- What is REST?: https://www.codecademy.com/article/what-is-rest
- What is a REST API?: https://www.redhat.com/en/topics/api/what-is-a-rest-api
- Roy Fieldings dissertation chapter, Representational State Transfer (REST): https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm 
- Learn REST: A RESTful Tutorial: https://restapitutorial.com/


## RESTful APIとは
RESTful APIとは（REpresentational State Transfer API）は、簡単にいうと、HTTPプロトコル[^1]を使用してクライアントとサーバー間で効率的なデータ通信を行うための方法です。

### REST API (Representational State Transfer API)

**REST API**は、REST（Representational State Transfer）の原則に従ったAPIを指す広いカテゴリの用語です。RESTの原則に基づいて設計されたAPIを指すものであり、RESTの原則に**一部準拠**していれば、そのAPIはREST APIと呼ばれます。

### RESTful API

**RESTful API**は、RESTの原則に従って**完全に**設計され、それに準拠しているAPIを指す用語です。つまり、RESTful APIは、RESTの原則を徹底的に遵守し、すべてのRESTの原則に従っています。一方、REST APIは、RESTの原則の一部を遵守しているが、完全に遵守していないAPIも含まれます。

## RESTの原則

- **アドレス可能性**
アドレス可能性とは提供する情報がURI[^2]を通して表現できることを指します。APIでは、データや情報をリソースとして扱います。これらのリソースは一意のURIを持ち、それを使用して識別されます。

- **統一インターフェイス**
統一インターフェースとは、リソース全体に適用できる「**情報操作の命令体系**」が定義され、共有されていることを指します。データに対する操作を行う際には、HTTPメソッド（GET、POST、PUT、DELETEなど）を使用して、リソースに対する操作を定義します。例えば、GETメソッドはリソースの取得、POSTメソッドはリソースの作成に使用されます。

- **ステートレス性**
 RESTful APIはステートレス[^3]であるため、各リクエストはそれ自体で完結し、セッション情報[^4]などの状態は保存しません。クライアントは必要な情報を含めてリクエストを送信する必要があります。

- **接続性**
 RESTful APIではクライアントがリソースへのリンクを受け取り、次にどのリクエストを行うかをリソースから取得することが奨励されます。これにより、クライアントとサーバー間の連携が向上します。
例えば、クライアントがリクエストを送信すると、APIは商品一覧を含むJSONデータ(以下例)を返します。このJSONデータには、各商品の詳細情報と、個別の商品にアクセスするためのリンクが含まれます。

```json
{
  "products": [
    {
      "id": 1,
      "name": "スマートフォン",
      "price": 500,
      "_links": {
        "self": { "href": "/api/products/1" }, 
        "buy": { "href": "/api/cart/add/1" }
      }
    },
    {
      "id": 2,
      "name": "ノートブック",
      "price": 800,
      "_links": {
        "self": { "href": "/api/products/2" },
        "buy": { "href": "/api/cart/add/2" }
      }
    }
  ]
}
```

## RESTful APIのメリット
１. HTTPメソッドを使用してリソースを操作するため、直感的に理解しやすくなり、APIの設計と使用が容易になります。

２. HTTPプロトコルをベースにしており、言語やプラットフォームに依存しないため、さまざまなプログラミング言語で利用できます。これにより、クライアントとサーバーが異なる言語で構築されていても、相互に運用することができます。

３. 新しいリソースやエンドポイントを簡単に追加できるため、アプリケーションの拡張が容易になります。

４. ステートレスであるため、サーバーの負荷が軽減され、スケーラビリティが向上します。

５. HTTPクライアントを使用して簡単にテストできるため、デバッグとテストが容易になります。


## 参考資料

https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2

https://ramble.impl.co.jp/2886/

[^1]: **HTTPプロトコル**
ホームページのファイルを受け渡しするときに使う約束事です。例えば、ホームページを見るときにはWebブラウザからWebサーバーにリクエストを出します。リクエストの内容をもとにサーバーからブラウザにデータをレスポンスとして渡します。このリクエストとレスポンスの際に使用する約束事がHTTPです。[こちら](https://wa3.i-3-i.info/word110469.html)にわかりやすい記事があったので、是非読んでみてください。 

[^2]: **URI**
URL(ホームページの住所に相当する情報)とURN（ホームページなどの「名前」に相当する情報）の総称です。つまりURLとURNはURIの一部ということになります。[こちら](https://wa3.i-3-i.info/word136.html)にわかりやすい記事があったので、是非読んでみてください。 

[^3]: **ステートレス**
以前の処理や通信の結果を内部状態として保存することをせず、毎回の入力のみによって一意に出力が定まるような処理方式のことです。[こちら](https://qiita.com/mtakehara21/items/efcbbc3ba58a62c10eb6)にわかりやすい記事があったので、是非読んでみてください。 

[^4]: **セッション情報**
ウェブアプリケーションやウェブサイトのユーザーセッション（ユーザーがサイトにアクセスしてから退出するまでの行動）に関する情報を格納するために使用されるデータのことです。セッション情報は、ユーザー認証、アクティビティの追跡などの目的で利用されます。