APIとその種類について整理

# はじめに

開発をするうえでAPIは避けて通れない単語だと思います。今回はAPIってそもそも何なのか、どんな種類があるのかといったことについて自作のマインドマップを用いながら軽くまとめたいと思います。


## APIの全体像を知るためのマインドマップ
個人で調べた上で自作しているため、分類の仕方が間違っている可能性があります。もし間違っている点があればご指摘いただければ幸いです。

![rapture_20250224234209.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834612/34d872b0-21d0-4b66-9178-860ce5417413.jpeg)


## APIとは？

API（Application Programming Interface）
APIとは、ソフトウェア同士が相互にやりとりするためのインターフェース（窓口）。

## APIの主な役割

・ **異なるシステム間の通信を可能にする**  
   例: スマホアプリから天気情報を取得する際、天気予報サービスのAPIを利用する。  

 ・**開発を効率化する**  
   既存の機能（認証、決済、データベース操作など）をAPIで提供することで、ゼロから開発する手間を省ける。  

 ・**セキュリティの向上**  
   APIを通じてアクセス制御を行い、不正アクセスを防ぐ。  

## APIの分類
APIは色んな分類の仕方ができるが、ざっくりとWeb APIとローカルAPIに分類することができる。Web APIとローカルAPIの定義とその具体例を書きに記す。

# Web API
**Web API** は、インターネットや社内ネットワークを介してアクセスできるAPIのこと。

### **特徴**
- **ネットワーク越しに通信**  
  - HTTP/HTTPS を使用して、異なるデバイスやシステム間でデータのやり取りができる。
- **クラウドや外部サービスとの連携が可能**  
  - 例: Google Maps API、Twitter API、AWS API など
- **クライアントとサーバーが分離**  
  - フロントエンド（Webアプリやモバイルアプリ）とバックエンド（サーバー）をAPIで接続。
- **セキュリティ対策が必須**  
  - 認証方式（APIキー、OAuth、JWT など）が一般的。
- **スケーラブルな設計が可能**  
  - クラウド環境で負荷分散（ロードバランシング）ができる。

### **主な使用例**
- **外部サービスとの連携**（Google Cloud API, OpenAI API など）
- **マイクロサービス間の通信**（各サービスが独立して動作）
- **Webアプリとバックエンドの通信**（フロントエンドがAPIを利用）


#  ローカル API
**ローカル API** は、同じコンピュータ内のソフトウェア間でやり取りするAPIのこと。

### **特徴**
- **ローカル環境でのみ動作**  
  - OSやアプリケーション内でのデータ通信に使用。
- **通信のオーバーヘッドが少ない**  
  - ネットワークを介さず、直接データをやり取りするため高速。
- **外部公開の必要がない**  
  - セキュリティ面ではWeb APIよりもシンプル。
- **OSやアプリに依存することが多い**  
  - Windows API, macOS API など、特定の環境向け。

### **主な使用例**
- **OSのシステムコール**（Windows API, POSIX API）
- **ローカルのアプリ間通信**（例えば、ブラウザと拡張機能の連携）
- **デスクトップアプリの内部処理**（Adobe製品のプラグインAPI など）


##  Web API と ローカル API の比較表

| 項目          | Web API                     | ローカル API                  |
|--------------|-----------------------------|-------------------------------|
| **通信範囲**  | ネットワーク越し（インターネット）| ローカル環境（PC内で完結）  |
| **使用プロトコル** | HTTP/HTTPS                   | OS依存のプロトコルやAPI |
| **速度**      | ネットワーク遅延が発生する可能性あり | 高速（ネットワークの影響なし） |
| **スケーラビリティ** | クラウドや複数デバイスで拡張可能 | 基本的に単一のデバイス内 |
| **セキュリティ** | 認証・暗号化が必須           | 基本的にローカルのみ |
| **使用例**    | REST API, GraphQL, SOAP      | Windows API, POSIX API |


# Web APIの具体例

Web API にはさまざまな種類があるが、特に**REST API, GraphQL API, SOAP API** の3つが代表的。


## 1. REST API（Representational State Transfer API）

### **概要**
REST（RESTful）API は、Web API の中で最も一般的な形式で、HTTPプロトコルを利用してデータをやり取りする。

### **特徴**
- **HTTPメソッドを活用**
  - `GET`（データ取得）, `POST`（データ作成）, `PUT/PATCH`（データ更新）, `DELETE`（データ削除） など
- **URL でリソースを指定**
  - 例: `https://api.example.com/users/123`（ID 123 のユーザー情報取得）
- **シンプルで広く使われている**
  - ほとんどの Web サービスが REST API を提供
- **キャッシュが利用可能**
  - レスポンスのキャッシュを活用して、パフォーマンスを向上できる


## 2. GraphQL API

### **概要**
GraphQL は Facebook が開発した API で、クライアントが**必要なデータだけを取得**できるのが特徴。

### **特徴**
- **クエリベースでデータを取得**
  - 例: `https://api.example.com/graphql` に対して、必要なデータをリクエスト
- **複数のリクエストをまとめて処理可能**
  - 1回のリクエストで、複数のエンティティ（例: ユーザー情報 + その投稿）を取得できる
- **型システムがある**
  - APIの仕様が厳密に決められており、エラーが発生しにくい


## 3. SOAP API（Simple Object Access Protocol API）

### **概要**
SOAP は、XML を使った Web API の規格で、企業向けシステムでよく使われる。

### **特徴**
- **XML を利用した通信**
  - データのフォーマットは XML のみ（JSON 非対応）
- **厳格なルール**
  - 契約（WSDL: Web Services Description Language）が定義されており、通信内容が統一される
- **高いセキュリティ**
  - WS-Security などのセキュリティ機能が標準搭載


## 4. Web API の比較表

| 項目         | REST API                         | GraphQL API                   | SOAP API                        |
|--------------|---------------------------------|--------------------------------|---------------------------------|
| **データ形式** | JSON, XML                       | JSON                           | XML                             |
| **リクエストの柔軟性** | 限られたデータしか取得できない  | 必要なデータだけ取得可能       | 厳密なデータフォーマット |
| **通信回数**  | 複数回のリクエストが必要になる | 1回のリクエストで完結しやすい | 1回だが通信量が多い |
| **キャッシュ** | 使いやすい                      | 使いにくい                     | ほぼ使えない                    |
| **セキュリティ** | 通常のHTTP認証やOAuthで対応     | RESTと同様                     | 高度なセキュリティ機能あり       |
| **用途**     | 一般的なWebサービス             | 高度なデータ取得が必要な場合   | 金融・企業向けシステム          |


一般的なWeb開発なら **REST API** が最も使われる。  
しかし、データ量が増えたり、複雑なクエリが必要なら **GraphQL API** の方が便利。  
**SOAP API** は銀行や企業向けシステムでは今でも使われるが、新規開発ではほぼ選ばれない。

# ローカル APIの具体例

ローカル API は、同じコンピュータ内で動作するソフトウェア同士が通信するための API のこと。  
特に**ネイティブ API、ライブラリ API、RPC API、カーネル API** の4つが代表的。

## 1. ネイティブ API（Native API）

### **概要**
ネイティブ API は、**OS が提供する低レベル API** で、システムの基本機能（プロセス管理、メモリ管理など）を操作できる。

### **特徴**
- **OS に依存**（Windows, macOS, Linux など）
- **低レベルなシステム操作が可能**
- **パフォーマンスが高いが、扱いが難しい**
- **多くのアプリやドライバが利用**

### **使用例**
- Windows API（Win32 API）
- macOS の Core Foundation API
- Linux の syscalls（システムコール）

## 2. ライブラリ API（Library API）

### **概要**
ライブラリ API は、プログラミング言語で提供される関数やクラスをまとめたもので、開発を簡単にする。

### **特徴**
- **プログラミング言語に依存**（C++, Python, Java など）
- **高レベルな機能を簡単に利用可能**
- **外部ライブラリとして提供されることが多い**
- **クロスプラットフォーム対応のものもある**

### **使用例**
- Python の `math` ライブラリ
- C++ の `STL（Standard Template Library）`
- OpenGL（グラフィック描画用ライブラリ）


## 3. RPC API（Remote Procedure Call API）

### **概要**
RPC（リモートプロシージャコール）API は、**ネットワークをまたぐことも可能なプロセス間通信（IPC）を実現する API**。  
ローカル環境内の異なるアプリケーション間で通信することもできる。

### **特徴**
- **リモートまたはローカルのプロセス間で関数を実行**
- **手続き型の API で直感的**
- **ネットワーク越しにも使える（gRPC, D-Bus など）**
- **分散システムやマイクロサービスでも活用される**

### **使用例**
- **D-Bus（Linuxのデスクトップ環境用IPC）**
- **gRPC（Googleが開発した高速RPCフレームワーク）**
- **Windows COM（Component Object Model）**

## 4. カーネル API（Kernel API）

### **概要**
カーネル API は、**OS のカーネルが提供する API** で、ハードウェアやシステムリソースの管理を行う。

### **特徴**
- **OS のカーネルレベルで動作**
- **プロセス管理、メモリ管理、ファイルシステム操作が可能**
- **システムコール（syscall）として提供**
- **ドライバや OS レベルのプログラムで利用される**

### **使用例**
- **Linux の `syscall`（`open()`, `read()`, `write()` など）**
- **Windows の NT カーネル API（`NtCreateFile()` など）**
- **macOS の XNU カーネル API**


## 5. ローカル API の比較表

| 項目         | ネイティブ API               | ライブラリ API               | RPC API                       | カーネル API                   |
|--------------|-----------------------------|-----------------------------|-------------------------------|-------------------------------|
| **通信範囲**  | OS 内部                     | プログラム内部               | プロセス間通信（ローカル/リモート） | OS のカーネル内部             |
| **用途**      | システムレベルの機能を提供   | プログラミングの補助         | 異なるプロセス間の通信        | OS のリソース管理             |
| **依存性**    | OS に依存                   | プログラミング言語に依存     | OS や通信方式に依存           | OS のカーネルに依存           |
| **難易度**    | 高い                         | 低い                         | 中～高                        | 非常に高い                     |
| **パフォーマンス** | 高い                    | 中～高                        | 通信のオーバーヘッドあり       | 最高                           |


# まとめ

今回は浅く広くAPIの全体像を知るために、APIの分類をしてそれぞれについて粒度を高くしすぎず調べた結果をまとめた。いつも通り学習をした結果さらにわからない単語が多く出てきたので、次回はそれぞれについてもう少し深く勉強して、個人開発に取り入れていきたいと思う。冒頭にもあるように、調べた内容やまとめ方に間違いがある可能性があるため、見つけた際は指摘していただけると幸いです。よろしくお願いします。