API Connectで、公開しているAPIを利用しているアプリケーションの一覧を取得する方法


## 開発者ポータルREST APIとは
API Connectでは、開発者ポータル機能を提供しており、API Connectで公開したAPIの仕様は、開発者ポータルに表示されます。表示可否や利用可否は、開発者ポータルにログインする開発者ごとに制御することができます。
API Connectでは、この開発者ポータル用のREST APIを提供しており、開発者ポータル上で提供している操作の一部が、API経由でも実行できる形になっています。この開発者ポータルREST APIを使って、自社の独自のWebサイト上にAPIの仕様を表示したり、プロバイダー管理者側における、運用や管理に利用することもできます。

## 参考マニュアル
+ [IBM API Connect v5.0 Knowledge Center : 開発者ポータル REST API の使用](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.apirest.doc/dev_portal_apis.html)



## やりたいこと
今回は、開発者ポータルREST APIを使って、プロバイダー側の管理者権限で、公開しているAPIを利用（利用登録）しているアプリケーションの情報を取得してみたいと思います。
この情報は、APIマネージャーというプロバイダー側の管理者向け画面上では見ることができますが、この情報をAPIで一覧取得します。


## 実行方法について
API Connectのクラスターは、「プロバイダー組織」という論理区画に分けることができ、「プロバイダー組織」の中に「カタログ」と呼ばれるデプロイ先の環境を複数構成することができます。
開発者ポータルは、この「カタログ」単位で構成され、開発者ポータルREST APIを実行する際には、どの「プロバイダー組織」のどの「カタログ」に対してAPIを実行するのかを指定しなければなりません。
これを指定する方法として以下の3つが用意されています。
（参考マニュアル : [[IBM API Connect v5.0 Knowledge Center : 開発者ポータル REST API の呼び出し](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.apirest.doc/api_calls.html)）

以下のうち、今回は、1.の方法で実行します。


1. `X-IBM-APIManagement-Context`ヘッダーに「プロバイダー組織名」、「カタログ名」を指定する


2. 「開発者ポータル API 呼び出しのホスト名」を使ってAPIを呼び出す

	この場合、APIマネージャー上の「カタログ」の設定にて、「開発者ポータル API 呼び出しのホスト名」を別名として設定しておく必要があります。
	また、管理サーバーのアドレスと「開発者ポータル API 呼び出しのホスト名」をDNSに登録しておく必要があります。


3. `X-Override-Host`ヘッダーに「開発者ポータル API 呼び出しのホスト名」を指定して、APIの呼び出しは、管理サーバーに対して行う

	この場合、2.と同様に、APIマネージャー上の「カタログ」の設定にて、「開発者ポータル API 呼び出しのホスト名」を別名として設定しておく必要があります。
	DNS登録は必要ありません。



Cloud Managerの「システム」という管理者ロールで各種操作を行います。
ツールとしては、curlを利用します。



## 実行

公開しているAPIを利用しているアプリケーションを取得するには、`開発者組織ID`と`製品ID`が必要になるので、まずはこれらの情報を開発者ポータルREST APIで取得します。

### 開発者組織IDの取得 - 開発者組織の作成

製品を利用（サブスクライブ）しているアプリケーションの取得は、「開発者組織」単位で行うため、開発者組織IDが必要です。開発者組織IDは開発者組織作成時に発行されます。
以下は開発者組織の作成例です。devorg01という開発者組織を作成する場合の例です。
レスポンスデータとして開発者組織IDが取得できます。

```リクエスト
# パラメーターセット
PROVIDER_ORG_NAME=provider01 # プロバイダー組織の名前
CATALOG_NAME=test3 # カタログの名前
MANAGEMENT_SERVICE_ADDRESS=mgt.test.com # 管理サーバーのアドレス
SYSTEM_USER=systemuser@**.* # システムロールのユーザー
SYSTEM_USER_PWD=******** # システムロールのユーザーのパスワード

curl -k -u cmc/${SYSTEM_USER}:${SYSTEM_USER_PWD} -H "X-IBM-APIManagement-Context: ${PROVIDER_ORG_NAME}.${CATALOG_NAME}" -H 'Content-Type: application/json' -X POST https://${MANAGEMENT_SERVICE_ADDRESS}/v1/portal/orgs -d '{
  "name": "devorg01"
}'

```


```レスポンス
{
	"id": "598bce44e4b01755c9e55c91",
    "name": "devorg01",
    "url": "https://mgt.test.com/v1/portal/orgs/598bce44e4b01755c9e55c91"
}
```

### 開発者組織IDの取得 - 開発者組織情報の取得

開発者組織IDは、開発者組織作成後も以下のように確認することができます。APIリクエストを実行したユーザーが属している開発者組織の情報が取得できます。

```リクエスト
# パラメーターセット
PROVIDER_ORG_NAME=provider01 # プロバイダー組織の名前
CATALOG_NAME=test3 # カタログの名前
MANAGEMENT_SERVICE_ADDRESS=mgt.test.com # 管理サーバーのアドレス
SYSTEM_USER=systemuser@**.* # システムロールのユーザー
SYSTEM_USER_PWD=******** # システムロールのユーザーのパスワード

curl -k -u cmc/${SYSTEM_USER}:${SYSTEM_USER_PWD} -H "X-IBM-APIManagement-Context: ${PROVIDER_ORG_NAME}.${CATALOG_NAME}" -H 'Content-Type: application/json' -X GET https://${MANAGEMENT_SERVICE_ADDRESS}/v1/portal/orgs

```

```レスポンス
[
  {
    "roles": [
      "598bce45e4b01755c9e55c92"
    ],
    "id": "598bce44e4b01755c9e55c91",
    "name": "devorg01",
    "url": "https://mgt.test.com/v1/portal/orgs/598bce44e4b01755c9e55c91",
    "owner": true
  },
  {
    "roles": [
      "598bd958e4b01755c9e55ffa"
    ],
    "id": "598bd957e4b01755c9e55ff9",
    "name": "devorg02",
    "url": "https://mgt.test.com/v1/portal/orgs/598bd957e4b01755c9e55ff9",
    "owner": true
  }
]
```



### 製品IDの取得

公開するAPIは、「製品」にパッケージングして公開しています。
公開している製品の情報を開発者ポータルREST APIで取得します。
以下は公開されている製品情報の取得例です。
`loanservice`が公開されている製品として取得でき、製品IDも同時に取得できています。

 ```リクエスト
# パラメーターセット
PROVIDER_ORG_NAME=provider01 # プロバイダー組織の名前
CATALOG_NAME=test3 # カタログの名前
MANAGEMENT_SERVICE_ADDRESS=mgt.test.com # 管理サーバーのアドレス

curl -k -H "X-IBM-APIManagement-Context: ${PROVIDER_ORG_NAME}.${CATALOG_NAME}" -X GET https://${MANAGEMENT_SERVICE_ADDRESS}/v1/portal/products

 ```
 
 ```レスポンス
[
  {
    "id": "59914b22e4b01755c9e719ee",
    "info": {
      "name": "loanservice",
      "title": "loanservice",
      "version": "1.0.0"
    },
    "url": "https://mgt.test.com/v1/portal/products/59914b22e4b01755c9e719ee",
    "status": "published"
  }
]
 ```

### 公開しているAPIを利用しているアプリケーションの取得

開発者組織IDと製品IDを使って、APIのセットである「製品」に利用登録しているアプリケーションを取得します。
以下は実行例です。
以下のように、製品`loanservice`を利用登録しているアプリケーションとして、`サンプルアプリ1`と`サンプルアプリ2`が取得できました。

```リクエスト
# パラメーターセット
PROVIDER_ORG_NAME=provider01 # プロバイダー組織の名前
CATALOG_NAME=test3 # カタログの名前
MANAGEMENT_SERVICE_ADDRESS=mgt.test.com # 管理サーバーのアドレス
SYSTEM_USER=systemuser@**.* # システムロールのユーザー
SYSTEM_USER_PWD=******** # システムロールのユーザーのパスワード
orgID=59915482e4b01755c9e71dae # 開発者組織ID
productID=59914b22e4b01755c9e719ee # 製品ID

curl -k -u cmc/${SYSTEM_USER}:${SYSTEM_USER_PWD} -H "X-IBM-APIManagement-Context: ${PROVIDER_ORG_NAME}.${CATALOG_NAME}" -X GET https://${MANAGEMENT_SERVICE_ADDRESS}/v1/portal/orgs/${orgID}/products/${productID}/subscriptions
```

```レスポンス
[
  {
    "id": "59915af9e4b01755c9e71fff",
    "app": {
      "id": "599156a5e4b01755c9e71ed2",
      "name": "サンプルアプリ1"
    },
    "product": {
      "id": "59914b22e4b01755c9e719ee",
      "name": "loanservice",
      "version": "1.0.0"
    },
    "plan": "Basic",
    "approved": true,
    "createdAt": "2017-08-14T08:10:33.909+0000",
    "updatedAt": "2017-08-14T08:10:33.909+0000",
    "url": "https://mgt.test.com/v1/portal/orgs/59915482e4b01755c9e71dae/apps/599156a5e4b01755c9e71ed2/subscriptions/59915af9e4b01755c9e71fff"
  },
  {
    "id": "59925dc5e4b01755c9e778b3",
    "app": {
      "id": "59925913e4b01755c9e77649",
      "name": "サンプルアプリ2"
    },
    "product": {
      "id": "59914b22e4b01755c9e719ee",
      "name": "loanservice",
      "version": "1.0.0"
    },
    "plan": "Basic",
    "approved": true,
    "createdAt": "2017-08-15T02:34:45.265+0000",
    "updatedAt": "2017-08-15T02:34:45.265+0000",
    "url": "https://mgt.test.com/v1/portal/orgs/59915482e4b01755c9e71dae/apps/59925913e4b01755c9e77649/subscriptions/59925dc5e4b01755c9e778b3"
  }
]
```



以上、開発者ポータル REST APIを使って、プロバイダー側の管理者権限で、公開しているAPIを利用しているアプリケーションの一覧を取得する方法でした。
開発者ポータル REST APIは便利なので、運用管理にもいろいろ使えそうです。