IBM i 駆け出し日記：REST APIを理解する(初心者向け)

# はじめに
IBM i ユーザー向けにREST APIについてまとめてみました。
ざっくり理解の初心者向け概念記事です。


# APIとは
異なるシステム/ソフトウェア間で機能を共有するための契約やプロトコルのことです。
APIを使うことで、異なるシステム間において様々なデータにアクセスし、ソフトウェア開発や分析ができるようになります。

つまり、IBM i の使い方がわからない人でもIBM i の中にある膨大なデータやプログラムにアクセスすることができるようになるんです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/15e3ff3a-0019-f869-e1ab-eb1cfad67f0c.png)


逆も然り、IBM i から外側のAPIシステムを呼び出して使うこともできます。

**APIの仕組みはよく電気のコンセントに例えられる**そうです。

普段電気のコンセントにプラグを差すとき、内部でどのような処理がされているかはあまり考えないのと同じように、コンセントに差す（APIを通じてリクエストを送る）と、内部の複雑な処理をAPIが行ってくれて、電流が流れる（レスポンスが返ってくる）というようなイメージです。

# Web APIとは
Webベースのアプリケーションやサービス間での通信を可能にするAPIです。インターネットを介してデータを交換し、プログラム間で情報を共有することが主な目的です。

Web以外の種類のAPIは例えば以下のようなものがあります。
- データベースAPI（例：JDBC［Java Database Connectivity］、ODBC［Open Database Connectivity］）
- ハードウェアAPI（例：カメラ、センサー、プリンター用のAPI）

# REST APIとは
最も一般的な**Web APIのタイプの一つ**です。

RESTの4原則と呼ばれるものに則って構築されています。その4つを簡単に紹介します。
## ①アドレス指定可能なURIで公開されている
REST APIにおいて、提供する情報はURI（Uniform Resource Identifier）で表現される必要があります。

例えば、IBMi75というシステム内の顧客リスト```SAKURALIB/TOKMSP```内の顧客番号01010の情報を入手したい場合、以下のようなURLで表現される必要があります。
```
http://ibmi75:10032/web/CUSTMQRY/01010
```

SAKURALIB/TOKMSPのデータが```http://ibmi75:10032/web/CUSTMQRY```によって提供され、その中で顧客番号01010が表示されているわけです。

## ②ステートレスである
ステートフルとステートレスの違いはクライアントとサーバー間のやりとりを維持するかしないかの違いです。
ステートレス性とは、情報のやり取りにおいて状態を保持せず、各リクエストやレスポンスが完結していることを意味します。

ステートレスなシステムのメリットは以下の通りです。


- **セッションレス** 
 APIのステートレス性は、各リクエストは完全に自己完結型であり、前後のリクエストとの間に直接的な依存関係はありません。

- **スケーラビリティである** 
ステートレスなAPIは、サーバー側でセッション情報を管理する必要がないため、システムのスケーラビリティが向上します。新しいリクエストが到着するたびに、サーバーはそのリクエストに対して即座に応答できます。

- **フェイルオーバーが簡単** 
特定のサーバーがダウンした場合でも、ステートレスなシステムでは、リクエストを処理するために特定のサーバーに依存する必要がないため、別のサーバーに処理を引き継ぐことが簡単にできます。

- **セキュリティの向上** 
セッション情報をサーバー側で管理しないため、セッションハイジャックのリスクが低下します。また各リクエストが自己完結型(=セッションレス)であるため、セキュリティ上の問題を管理しやすくなります。

## ③ 関連する情報に対して簡単にアクセスすることができる
関連する情報に対して簡単にアクセスすることができる、すなわち接続性があることが必要です。
接続性とはクライアントとサーバーがスムーズに通信し、データをやり取りできる能力です。
これには以下の要素が含まれます：

- **信頼性** : 通信が安定しており、データが正確に送受信されること。
- **可用性** : サーバーが常に稼働しており、クライアントがいつでもアクセスできること。
- **レスポンス時間** : リクエストに対するサーバーの応答が迅速であること。
- **帯域幅** : 十分なデータ転送容量があること。

## ④ データに対する操作が標準化されている
APIがリソースを操作する際に決まった方法で操作を行う＝操作方法が統一され、開発者は一貫した方法でリソースを操作できる必要があります。
具体的にいうと、REST APIでは、HTTPメソッド（GET、POST、PUT、DELETE）を使ってリソースを操作します。
またデータの形式はJSONを利用します。

### データの操作はHTTPメソッドを使用

データに対する操作はお馴染みCRUD(Create, Read, Update, Delete）操作で行われますが、REST APIではそのCRUD操作とHTTPメソッドがマッピングされています。

HTTPメソッドとは、クライアントが行いたい処理をサーバに伝えるものです。


CRUD操作とHTTPメソッドは以下のようにマッピングされています。
|CURD名|意味|HTTPメソッド|
|-----|-----|-----|
|Create|作成|POST/PUT|
|Read|読み込み|GET|
|Update	|更新|PUT|
|Delete|削除|DELETE|

### データの形式はJSONを使用
REST APIにおいて、データの受け渡しをする際、データの形式はJSONを使用します。

JSONは、Webアプリケーション開発におけるデータ交換の標準語のようなものです。
IBM i のデータ形式をそのままIBM i 外のシステムに渡しても、独特すぎて読み込めないのでJSON形式に変換してからIBM i 外のシステムに渡します。


JSONのデータ形式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/5062907b-8533-ff6a-f791-c38c5e631f48.png)


# REST APIをIBM i で活用するメリット
## ①外部システムからDB接続を行う際のめんどくさいあれこれが不要
REST APIを使用せずに外部からDB接続を行う場合、
DB操作をするためのjavaプログラムを書き、そのプログラムを外部サーバーでうごかして、IBM i 側ではODBC,JDBC接続の設定を設定して、、、と色々ステップを踏む必要があります。

またIBM i 外のシステム、アプリケーションが1つだけではなく、LINEやクラウド、さまざまなタイプのシステムからも参照したいとなると、またそれぞれ設定作業が必要となります。

しかしREST APIではIBM i で標準搭載されている統合APサーバーを使用すれば、以上の手順は踏まずにすみます。

APIは一度作成すれば、他のシステムやアプリケーションから再利用できるので、コードの重複を避けることができ、開発効率が向上します。


なのでIBM i にある大量の貴重なデータ活用にもつながる！ということです。


## ②拡張性の高いシステムを作ることができる
REST APIを活用するシステムは疎結合です。
疎結合なシステムとは、システムを構成するコンポーネントやモジュールが独立して動作でき、お互いの変更や障害に対して影響を最小限に抑えることができる設計のことです。

疎結合の対義語に密結合という言葉があります。
密結合（要素間の関係性が強く、個々の要素が他の要素へ及ぼす影響が大きな状態)なシステムは、もし問題が起こった時の切り分けが難しいこと、また急速な変化への対応が難しいこと、さらには構造が複雑化なためシステム全体のブラックボックス化にもつながります。(IBM i でよく問題視されていること)

REST APIを活用するシステムは、コンポーネント間の境界を明確に定義するため、各コンポーネントが独立して動作できます。
これにより、コンポーネント間の依存関係が減り、疎結合が実現されます。
疎結合なシステムは新しい機能の追加や既存機能の変更が簡単になるので、柔軟で拡張性が高く、メンテナンスが簡単です。

なので、REST APIを使用することでアップデートが頻繁に必要になる今どきなシステム開発にIBM i のデータを活用できるようになるのです！