[Flutter] API通信まとめ

# はじめに
HTTP通信を実装する際に使い方をすぐに理解できなかったので、備忘録としてまとめました。

# 対象者
- 実務での開発経験がないまたは少ない方
- API通信について0から学習したい方
- API通信に対する理解がない方
- API通信を行ったことがない方

# APIの説明
**API**とは「**Application Programming Interface**」の略称です。

インターフェースとは、異なる２つの事物の間をつなぐという意味を持ちます。例えば、USBも「パソコン」と「周辺機器」をつなぐものですので、インターフェースの一つです。

要するに、APIとは、「アプリケーション、ソフトウェア」と「プログラム」をつなぐもの、という意味になります。

### APIの利用
APIを使用してソフトウェアやアプリケーションなどの一部を外部に向けて公開することによって、第三者が開発したソフトウェアの機能を共有できるようなります。
例えば、異なるサービス間で認証機能を共有したり、片方のサービスからデータを取り込んで、取り込んだデータをもう片方のサービスで利用するなど使い方は多岐に渡ります。

では、APIを公開するとは、どういうことでしょうか？
もうお分かりいただけたかもしれませんが、簡潔に言うと、ソフトウェアに外部とやりとりするための窓口を作り、外部との連携ができる状態になるということです。何をして欲しいのかをAPIに要求して、ルールに基づいて要求が書かれていれば、APIを提供するサービスやソフトウェアが処理をして、その結果を返してくれます。

当たり前ですが、APIは定められた仕様外のことはできません、APIの提供者が公開する段階でサービスの利用範囲を決めているので、決められたこと以外はできないようになっています。

### APIのプロセス
APIのプロセスとして基本的にリクエスト(要求)とレスポンス(応答)で構成されています。
リクエストを行うのがAPI利用者で、レスポンスを行うのがAPI提供者です。
先ほども触れましたが、何のリクエストに対して何のレスポンスを返すのかというリクエストとレスポンスに関するルールはAPIの提供者が策定します。

### APIの種類

APIはいくつかの種類があり、APIの使用用途に応じてそれぞれ使い分けられます。

- **ネイティブAPI** => OSが持っている機能を他のアプリケーションでも呼び出すことができるようになるAPIです。例えば、ネイティブカメラAPIを使用して、カメラ機能をサードパーティ製のアプリで使用するなどプラットフォームが提供する様々なサービスを利用できるようになります。

- **ランタイムAPI** => 実行時(ランタイム)にプログラムの実行や制御を行うためのAPIです。
例えば、ランタイムAPIを用いることで、既存のクラスやメソッドに変更を加えたり、新しいクラスやメソッドを追加したりすることができるようになります。

- **ライブラリAPI** => 特定の目的や機能を持つライブラリの利用を容易にして、その機能をプログラムに取り込むためのメソッドやクラス、関数などを提供します。
例えば、数値計算ライブラリAPIを用いることで、高速な数値演算や行列操作を実行することができるようになります。

- **データベースAPI** => データベースからのデータの取得や更新などのデータベース操作を抽象化して、プログラマがデータベースを効果的に利用できるようにしてくれます。
例えば、データベースAPIを用いることで、データベースサーバーに接続するためのメソッドや関数を利用できるようになります。これにより、プログラムを通してデータベースにアクセスできるようになります。

- **WebAPI** => HTTP/HTTPSでクラウドを介して通信を行うことで、サーバからデータを取得することができるようになります。例えば、RESTfulAPIを使用してサーバー上のデータを削除することができるようになります。

https://data.wingarc.com/what-is-api-16084

https://www.sbbit.jp/article/cont1/62752

# HTTPメソッド
### HTTPメソッドとは
HTTPメソッドは**クライアント**(ブラウザやアプリ)が**Webサーバー**に対して**要求**を依頼するための手段となります。
例えば、ウェブページ上にあるフォームからデータを送信したいとします。この場合、一般的には以下のようなプロセスが行われます。

1. **クライアント**（ブラウザ）は、フォームのデータを収集し、サーバに送信したいと考えます。

2. **クライアント**は、フォームのデータを含む**HTTPリクエスト**を生成します。このリクエストには、送信したいデータや目的のリソースのURL、そしてHTTPメソッドが含まれます。

3. **クライアント**は、HTTPメソッドとして「**POST**」を使用してサーバにリクエストを送信します。**POSTメソッド**は、新しいリソースの作成やデータの送信に使用されます。

4. **サーバ**は、受け取った**POSTリクエスト**を処理します。データの受け取りやバリデーションなど、サーバ側で必要な処理を行います。

5. **サーバ**は、処理結果や応答データを含む**HTTPレスポンス**を生成します。このレスポンスには、ステータスコードや必要なヘッダー情報、そしてクライアントに返すデータが含まれます。

6. **サーバ**は、生成した**HTTPレスポンス**を**クライアント**に送信します。

7. **クライアント**は、受け取った**HTTPレスポンス**を処理し、必要に応じて適切なアクションを実行します。 => 成功メッセージを表示したり、別のページにリダイレクトしたりなど。

この具体例では、クライアントはフォームのデータをサーバに送信するためにPOSTメソッドを使用しています。サーバは受け取ったリクエストを処理し、それに対する適切な応答を生成してクライアントに返します。HTTPメソッドの選択は、クライアントが行いたい要求の種類に基づいて行われます。

### GET/POST/PUT/DELETE 
HTTPメソッドはいくつかありますが、その中でも使用頻度の多い「**GET**」/「**POST**」/「**PUT**」/「**DELETE**」 を紹介していきたいと思います。
> CRUDとはシステムに必要な4つの主要機能である「Create（生成）」「Read（読み取り）」「Update（更新）」「Delete（削除）」の頭文字を並べた用語
https://wa3.i-3-i.info/word123.html


| CRUD | HTTPメソッド |
| --- | --- |
| Create | POST/PUT |
| Read | GET |
| Update | PUT |
| Delete | DELTE |

- **GET**は**リソースを取得**するためのメソッドです。
    - サーバーから**データを取得するために**使用されます。
    例えば、Webページを見たいとき、「Webページを取得したいです」というGETリクエストを送信し、Webページのhtmlなどを受け取ります。
    - **読み取り専用のメソッド**であるため、データが変更されたり破損したりするリスクはありません。
    - データを取得するだけなので、**データのキャッシュ**が可能です。

- **POST**は**リソースを作成**するためのメソッドです。

    - クライアントがサーバーに**データを送信するために**使用されます。
    例えば、オンラインショップで商品を購入するとき、顧客は注文フォームに必要な情報（商品の数量、配送先住所など）を入力します。入力された内容を元にクライアント（ブラウザ）は、HTTPリクエストを生成します。この生成されたリクエストの要素として含まれるのが「**POST**」メソッドです。

    - **機密性の高いデータ、大量のデータ**（リクエストパラメータに収まらない）を送信するのに優れています。

- **PUT**は**リソースの更新/作成**を行うためのメソッドです。

    - PUT メソッドは、**既存のリソースを更新するために**最もよく使用されます。
    - リソース作成のほとんどはPOSTが使われることが多いため、現在は**更新用**のメソッドという認識で十分です。例えば、SNS上でユーザが投稿した内容を編集したいとき、編集フォームに変更内容を入力します。ユーザが既存の投稿を編集する際に、**PUTメソッド**が生成され、クライアントは生成された**PUTリクエスト**をサーバに送信します。
        
    - POSTと似ていますが、**PUT**は何度同じ操作をしても結果が同じになるようなものに用います。

- **DELTE**は**リソースの削除**を行うためのメソッドです。

    - 特定のIDを持つデータを削除する、特定の日付の範囲のデータを削除するといった、何度削除命令を出しても同じ状態になる場合に実装しなければなりません。    

https://tsuyopon.xyz/2019/01/31/understand-4-http-methods/

https://developers-book.com/2020/07/20/140/

### APIモック
APIモックとは、開発中やテスト中に実際のAPIと同様の動作を模倣するために使用される仮想的なサーバやサービスのことです。フロントエンドとバックエンドの並行開発を可能にすることで、プロジェクトの進行をスムーズにします。

以下の目的で利用されます
- バックエンドの実装が完了していない場合、フロントエンドの開発者はAPIのモックを使用してアプリケーションの機能を開発できます。
- 外部システムやデータベースへのアクセスが必要ない場合、モックを使用してAPIの応答をテストできます。
- 複数の開発者が同時に作業する場合、各開発者はモックを使用して独立して作業を進めることができます。

モックは本物のデータを返さず、**あらかじめ定義された**データやテストデータを使用することが一般的です。

(例) **JsonServer**
JsonServerは、モックAPIサーバの一種であり、開発やテストの目的で使用されます。シンプルなRESTful APIを提供し、JSON形式のデータを返すことができます。

> 　RESTfulAPIは、REST（Representational State Transfer）の原則に基づいて設計されたAPIのことです。
　Webシステムを外部から利用するためのAPIであることから、REST APIはWeb APIの1つだと言えます。
　REST APIでは、HTTPで定義するGET、POST、PUT、DELETEなどのリクエストでデータを操作します。
https://www.infraexpert.com/study/sdn09.html

**JsonServerの主な特徴**

- **シンプルなセットアップ**: JsonServerは、独立して動作するため、追加の設定やセットアップは不要です。簡単にインストールして、ローカル環境で利用することができます。

- **モックデータの作成**: データをJSONファイルに記述することで、モックデータを作成することができます。これにより、実際のデータベースや外部のシステムへの依存なしに開発やテストを行うことができます。

- **RESTful APIの提供**: JsonServerは、シンプルなRESTful APIを提供します。エンドポイントごとにデータを取得したり、作成したり、更新したり、削除したりすることができます。データのフィルタリングやソートなどもサポートされています。

# 終わりに
以上API通信まとめについてでした。

開発においてAPI通信はあらゆる場面で利用されます是非今回の記事を活用してみて理解を深めていってください。

意見や不明点等あれば気軽にコメントしていただければと思います。

最後までお付き合いいただきありがとうございました。