IBM API Connect 使ってみた〜APIを作る〜


# IBM API Connectとは
一言で表すと，**企業内で保持するビジネスアセットをAPIとして公開するためのソリューション**である。

- IBMは，2015年にStrongLoop社を買収を発表し，2016年2月には買収を完了
- 3月末には，IBM API ManagementとStrongLoop(ゲートウェイやLoopBackなど)と統合し，IBM API Connectというソリューションとなる
- StrongLoop機能の追加によって，「APIを管理する，保護する」に加えて，「APIを作る」部分も兼ね備えるようになった

API公開のメリットや，そのためにクリアすべき前提条件については，他の方の投稿に頼らせて頂くことにし，本稿では「APIを作る」ことにフォーカスした超入門を紹介する。

# API Connectでやれること (ざっくり抜粋)
* APIを作る
    * loopbackフレームワークを使ったREST API作成 (Swagger)
        * CLI (apicコマンド + loopbackで作成)
        * GUI (API Designerで作成)
* APIを実行する
    * Node.jsやJavaランタイム上でAPIアプリを実行
    * Node.jsやJavaランタイム自体の運用管理
    * 作ったAPIを任意の環境にデプロイ (Bluemix上も選択可)
* APIを管理する
    * API利用におけるポリシー定義
    * 利用状況の取得・分析
    * API提供者側の管理ポータル
    * API利用者側のための開発者ポータル
* APIを保護する
    * 認証・認可
    * OAuth

# 環境
- Mac OS X El Capitan v10.11.3
- Xcode v7.2.1
- Node.js v4.2.2
- npm ~~v2.14.7~~ v3.8.5

Node.jsのバージョン管理は，nodebrewを使っている。
そちらに関しては別記事にて。([MacでNode.jsのバージョン管理](http://qiita.com/capsmalt/items/891d5985c2bbbb5eb1e0))

# API ConnectでAPIを作ってみる
### 1. apiconnectモジュールのインストール
```bash
$ npm install -g apiconnect
```

### 2. loopbackフレームワークでひな形REST APIアプリの生成 
apicコマンドで，インタラクティブにひな形アプリを作成できる。デフォルトのままの場合は，EnterでOK

```bash
$ apic loopback <任意のアプリ名>    // apiconnect v2系から使用不可
```
```bash
$ apic loopback    // 変更後
```
<Font color="red">(2016/06/07追記)
※コマンド実行時にアプリ名を入れるのはNGになった模様
※この他の微妙な変更箇所は，[差分まとめ記事(6/5)](http://qiita.com/capsmalt/items/ed1c58ae34eada88eb66)を参照</font>



- 任意のアプリ名 : `capsmaltApp` (デフォルト)
- アプリタイプ : `サンプル(hello-world)を含む形式` (デフォルト)

![スクリーンショット 2016-03-24 0.14.21.png](https://qiita-image-store.s3.amazonaws.com/0/69447/bf27c20f-9659-edc8-5c0a-75f075056c09.png)

ひな形に含まれるpackage.jsonの中身に従って，npm installで依存するNodeモジュールが自動ダウンロードされる (完了まで十数秒待つ)
![スクリーンショット 2016-03-24 0.14.50.png](https://qiita-image-store.s3.amazonaws.com/0/69447/e49738bc-094b-77bf-4a14-faba422f9056.png)

下記の画面まで進めば，ひな形アプリは完成。
次のステップとしてガイドが表示される。
- cdコマンドで作ったアプリ内に移動 **<--- 重要。忘れずに**
- 「モデル作成」
- 「GUIコンソール(API Designer)の起動)」
- 「アプリの始動」の
![スクリーンショット 2016-03-24 0.16.52.png](https://qiita-image-store.s3.amazonaws.com/0/69447/564564a5-44ae-e6d1-9f2e-3de701d58963.png)

### 3. Modelを作成
上図のガイドに従って，以下のように入力

```bash
$ cd capsmaltApp

$ apic create --type model
```

Model作成もインタラクティブに行えるので，必要な情報を入力する

- モデル名: Cat
- データソース: db (memory)
- モデルの基本クラス: PersistedModel
- REST API: Yes
- Custom plural: ブランクのままEnter
- Common or server only: server
<img width="651" alt="スクリーンショット 2016-03-24 0.36.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/21705ec3-4d83-663e-638c-1f03b6cf556f.png">

- 1つめのプロパティーを設定 (猫種の名前)
    - プロパティ名: name
    - データ型: string
    - 必須か否か: No
    - デフォルト値: (blank)  
<img width="468" alt="スクリーンショット 2016-03-24 0.38.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/1f46d345-e663-49a5-e5a2-e9431e243b53.png">
- 2つめのプロパティーを設定 (毛色)
    - プロパティ名: color
    - データ型: string
    - 必須か否か: No
    - デフォルト値: (blank)  
<img width="500" alt="スクリーンショット 2016-03-24 0.39.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/4379c89a-20ea-5610-135b-984df928c339.png">

### 4. API ConnectのGUI画面で確認 (API Designer)
API Designerを起動

```bash
$ apic edit
```

<img width="577" alt="スクリーンショット 2016-03-24 0.47.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/b597f68b-961c-1fbc-6ac7-0446b77f1798.png">

自動でブラウザが立ち上がる (http://127.0.0.1:9000)
「製品・API・モデル・データソース」の「API」のページが開く

図の中央あたりに，
**capsmaltApp 1.0.0** という先ほど作成したAPIが確認できる
<img width="819" alt="スクリーンショット 2016-03-24 0.48.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/afa9faae-5b93-0287-eada-15adc5fa87f8.png">

「モデル」を開くと，先ほど作成したモデルの**Cat**が確認できる (noteはデフォルトで作成されている)
<img width="818" alt="スクリーンショット 2016-03-24 0.48.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/5045741d-8bbf-adc1-f429-9f19ce5c9dc2.png">

### 5.「実行」でLoopBackアプリケーションを始動 (API Designer)
右側にある「実行」を選択し，その後「始動」を選択する
下図のように，ローカル環境でAPIのランタイムが始動する
==> **「実行」**では，**APIアプリの始動・停止が行える**

<img width="817" alt="スクリーンショット 2016-03-24 0.49.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/8827296e-b05c-9982-95c2-163aa8a103ec.png">

ちなみに，コマンドで始動・停止する場合は，以下のようにする

```bash
$ apic start         // コマンドを実行したプロジェクト内のMicroGatewayとアプリケーションを始動する

$ apic stop          // コマンドを実行したプロジェクト内のMicroGatewayとアプリケーションを停止する

$ apic stop --all    // 全てのプロセスを停止する (どのディレクトリで実行してもOK)
```


### 6.「探索」でCRUD操作をテスト (API Designer)
プロセスが始動している状態で，右側にある「探索」を選択する

- 「Catモデル」のCRUDが既に作成済で用意されている (図の左側のリスト)
- 各メソッドの要約，パラメータ，応答を確認できる (図の中央部分)
- 作成したAPIを呼び出すためのサンプルコードを確認できる (図の右側部分)
    - cURL，Ruby，Python，PHP，Java，Node，Go，Swift

==>**「探索」**では，**APIのCRUD操作が行え，API呼び出しの実装コード例を確認できる**
<img width="1283" alt="スクリーンショット 2016-03-24 0.57.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/09f166c6-e757-3719-1876-4dcb78f35338.png">

- 左側リストの中から「POST /Cats」を選択する
- 右側のAPI呼び出しサンプルコードの部分で，アイテムを追加する
    - 「スキーマの表示」を選択  
    <img width="202" alt="スクリーンショット 2016-03-24 1.16.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/9ba5f89b-9fd5-8bfa-5445-3f33d795f9bf.png">
    - 「生成」を選択 (図では，Singapura / Sepia / 1 を入力)  
    <img width="186" alt="スクリーンショット 2016-03-24 1.19.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/8c0a40a4-f9b4-e192-288a-2066ed65d1b9.png">
    - 「操作の呼び出し」を選択  
    <img width="122" alt="スクリーンショット 2016-03-24 1.23.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/edfd8a04-a457-617b-1877-86f3ac06f20b.png">
    - 下図のように，「要求，応答，結果のjson」が確認できる
    <img width="430" alt="スクリーンショット 2016-03-24 1.22.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/baf702d6-0aeb-08f2-3fa1-8f4760acf8dd.png">
    - 「GET /Cats」で実行した場合の結果は以下  
        - 上述の手順とは別に，「Scottish Fold / Cream / 2」をPOSTで追加済
        - 合計2匹の猫が登録されていることが確認できる
    <img width="426" alt="スクリーンショット 2016-03-24 1.31.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/a1cdae2a-ab4e-4d08-ccb2-da8aeca54523.png">

# まとめ
- **誰でもすぐに作れる**
実際に触ってみてわかったことは，やはり簡単なAPIの作成は非常にスピーディーに行える。apiconnectモジュールをインストール済の場合，~~`$ apic loopback アプリ名`~~ `$ apic loopback`，`$ apic create --type model`の2つのコマンドだけで，CRUD構築済のAPIが手に入る。特に，作成したAPIの利用にあたり，**NodeやJava，Ruby，Pythonなどの各言語用のサンプルコードを得られる**ため誰でもとっつきやすく，すぐに試すことができる。もちろんバックエンドのDBやRESTなどをデータ・ソースとして設定することも可能で，`$ apic loopback --type datasource`のコマンドでインタラクティブに行える。シンプルな内容であれば，GUI(API Designer)でも同様のことが実施できるのも魅力の1つかもしれない。

- **StrongLoop(LoopBack)のスキルが活用できる**
ちなみに従来のStrongLoopを利用する場合との違いの1つは，コマンド名の違いである。従来は，`slc loopback`のようにしてひな形アプリを作成していたが，API Connectでは，`apic loopback`と入力する。また，GUIでモデル作成や管理をする際にも従来は`slc arc`と入力してStrongLoop Arcを起動していた。API Connectでは，`apic edit`と入力し，API Designerを起動する。この部分に関しては，若干コマンドは変わるものの，StrongLoopのloopbackに慣れている方はそのままスキルが活用できる。

今後は「API Connectを使用して，APIを公開する」部分についても記載予定。また，「APIが稼働するNodeランタイム自身の管理」についても触れる予定。

****
※本稿は，IBMのマニュアルサイト(KnowledgCenter)がまだ存在しない時期(2016/3/22深夜)に，npmモジュールを利用して確認した内容を投稿したものです。このため，一部使い方の変更点があるかもしれません。

※<Font color="red">apiconnectモジュール v2系</Font>では，GUIやLoopBackアプリ作成時のコマンドオプション(e.g. コマンド実行時にアプリ名を指定しない形式に変更)等，一部修正点があります。この差分については，[差分まとめ記事(6/5)](http://qiita.com/capsmalt/items/ed1c58ae34eada88eb66)を参照ください。(2016/06/07追記)