MulesoftでAPI開発～API仕様を作って取り込む～

# はじめに
APIを作成する際、通常は
**1. API仕様を作成**
**2. API仕様をAnypointStudioに取り込む**
**3. AnypointStudioでAPIを実装する**

という流れでAPIを作っていきます。
なので[前回の記事](https://qiita.com/pluejomo/items/2417cd4c58142d6f5eb3)では、いきなり

**3. AnypointStudioでAPIを実装する**

をやっていたことになります。
今回は上記の

**1. API仕様を作成**
**2. API仕様をAnypointStudioに取り込む**

の部分をやっていこうと思います。

# API仕様の記法の選択
MulesoftではAPI仕様の作成において
- RAML
- OpenAPI

の２つの記法が可能です。
Mulesoftの公式ドキュメントではRAMLがメインな感じでに記載されていますが、
本記事では利用者の多いと思われるOpenAPIでやっていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/bafa6451-c8ff-84a0-43ff-a05764be2473.png)

# API仕様の作成

AnypointPlatform上にある、DesignCenterを使って作成します。

#### DesignCenterにアクセスする
AnypointPlatformにログイン後、[Start designing]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/d9b74175-7862-4aff-511c-0cafda9f4b4a.png)

#### [+Create new] -> [New API Specificatoin]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/4839d95d-dea3-2dd7-b288-c14b4f50951c.png)

#### API仕様の記法の選択
- API名の設定：今回は **hello-mule**と名付けました
- API機能の選択：今回は **OAS3.0(YAML)** を選択しました
※OAS：OpenAPI Specificationの略

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/a5181eef-43c3-56c8-ba5d-2ae92402944b.png)

#### API仕様を記述する画面の構成
画面の構成を見ていきます。

**エクスプローラ**
画面左側はAPI仕様のファイルが表示されています。
[+]ボタンからフォルダやファイルを追加することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/b2c7d998-3d10-227b-91f4-664f7c2b39a4.png)

**仕様の記述部分**
画面中央にAPI仕様を記述していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/e169d22f-e239-495f-d4a5-816606887adc.png)

**入力支援機能**
仕様の記述部分の下には、
現在のカーソル位置に合わせて入力可能なキーワードが表示されます。
下図では`title: hello-mule`から改行した位置にカーソルを当てた際に
入力候補が表示されている状態を載せています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/46f45828-5239-d070-7779-cde2c7063d5e.png)

**プレビュー**
画面右側は記述中のAPI仕様のプレビューがリアルタイムで反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/4c0f610c-9a6c-4c27-442d-9b00cd964d6a.png)

# API仕様の記述
#### OpaneAPIの仕様
初期状態は
```yaml
openapi: "3.0.0"
info:
  version: 1.0.0
  title: hello-mule
paths: {}
```

となっています。
今回のAPIの仕様は以下のようなものにします。
- HTTPメソッド：GET
- APIのパス：`/hoge`
- リクエストパラメータ：なし
- レスポンス形式：json
    - `hello:xxx`

```yaml
openapi: "3.0.0"
info:
  version: 1.0.0
  title: hello-mule
paths:
  /hoge:
    get:
      responses:
        "200":
          description: ok
          content:
            application/json:
              schema:
                type: object
                properties:
                  hello:
                    type: string
              example: 
                hello: "mule!"
```

# API仕様のモックを動かしてみる
ここまで書くと、画面右側のプレビューからAPIモックで動作確認することができます（すごい）。

#### [GET]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/6c1ae182-5b47-da80-27e4-5ee6f17b6402.png)

#### [Try it]をクリック
記述したAPIエンドポイント`/hoge`の仕様が確認できます。
右上の[Try it]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/aff8062b-2b81-fd36-cc45-469c0bc657db.png)

#### [Send]をクリック
ヘッダやリクエストパラメータがあればここで設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/569a6e6a-8b87-06d0-d29f-78a54b924d2c.png)

#### レスポンスを確認
[Send]ボタンの下に結果が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/7e93131e-0ec6-6512-f006-62a3eff29001.png)

:::note warn
あくまでモックなので、
リクエストパラメータ等による動的な結果は得られません。
ここで得られる結果は
```yaml
              example: 
                hello: "mule!"
```
の固定した内容です。
:::

# APIをPublishする
API仕様の記述が完了したらPublishします。
Publishすることで、API仕様がExchangeに公開され、
AnypointPlatformを利用している他のメンバも仕様を見ることができるようになります。

また、今回の目的である
AnypointStudioでのAPI仕様を取り込んだAPI実装が可能になります。

#### [Publish] -> [Publish to Exchaange]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/5a95bf9b-e861-345f-b84d-ca66c9c967e6.png)

#### Publishの実行
バージョンを入力して[Publish to Exchange]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/b3e33c69-c28f-1e1e-d6e3-3916f800a39a.png)

#### Publish中
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/7ff5632c-92b1-4326-67c1-974af0f96b0a.png)

#### Publish完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/66e34e8a-d302-de62-37ae-127f697cb3a1.png)

# PublishしたAPIをExchangeで確認する
#### Exchangeに移動
AnypointPlatformのトップページからも行けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/4680b6a2-bb23-ada3-77b8-fbc1c283816c.png)

#### Exchange上でもモック動作確認が可能
Exchange上ででAPI仕様が公開出来ていることを確認できました。
ExchangeでもDesignCenterと同様、モックを動かすことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/60fc13be-7790-1a9c-2679-bd11a90a5245.png)

# AnypointStudioでAPI仕様を取り込む

:::note warn
AnypointStudioにAnypointPlatformのアカウントの設定をした状態で行ってください。
AnypointPlatformのアカウントの設定は以下に載せています。

[MulesoftでAPI開発～APIをCloudHubにデプロイ～](https://qiita.com/pluejomo/items/843f3ef0457011194148#anypointstudio%E3%81%ABanypointplatform%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A)
:::

#### [File] -> [New] -> [Mule Project]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/b1fc7e8c-ebc9-e684-d208-72e9aff90948.png)

#### プロジェクト名を入力し、[+]ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/ea18a545-c542-08b8-b7e6-250de33ef13d.png)

#### [from Exchange]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/c0219efa-2b27-cea6-c17b-386cb41336e5.png)

#### ExchangeでAPI仕様を検索し、取込み対象を選択
DesignCenter上でAPI仕様を作成した際のユーザIDを選択し、
API仕様名を入力すると、自動で検索される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/b277c0d8-2d33-109a-3db1-ed2f4fd11007.png)

取込み対象のAPI仕様を選択 -> [Add] -> [Finish]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/7435fc18-a453-da00-7938-8fb1499bac87.png)

#### [Finish]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/6d52f1a8-2bf4-0aa0-73de-ce2fbc81869e.png)

これでAPI仕様を取り込んだプロジェクトが生成されます。

# 作成したプロジェクトの確認
#### PackageExplorer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/26584ecb-af1d-ac67-a1b9-f6546dfabdd1.png)

このような感じになっています。
- hello-mule.xml ではフローが自動生成されています（後述で中身見ていきます）
- hello-mule[v1.0.0] ではDesignCenterで生成したAPI仕様のファイルがzip形式で取り込まれています。

#### 自動生成されたフロー（hello-mule.xml）
3つのフローが自動生成されています。

**(1)メインのフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/8b6da645-cea9-ab3b-0632-aeb761c5f9ed.png)

メインのフローには以下の特徴があります。
- APIkit Routerを含む
APIkit RouterにはリクエストされたAPIエンドポイントのパスごとに、
それぞれの専用のフローに割り振る役目があります

- エラーハンドリングを含む
デフォルトでどのAPIにも必要となりそうなエラーハンドリングが生成されています。

**コンソール用フロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/514f652b-2a1b-23a5-b6bc-47e8a5100431.png)

APIを起動した際、ExchangeのようなAPIコンソール画面を起動するためのフローです。
API起動後、`{URL}/console`にアクセスすると以下のような画面が起動し
APIの動作確認が可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/a429ecde-c88b-6f28-766a-c6e9931e8e57.png)

**APIエンドポイントのフロー**
メインのフローにあるAPIkit Routerから呼び出されるサブフローとなります。
つまり`/hoge`のAPIエンドポイントへのリクエストはAPIkit Routerによって、
こちらのサブフローに処理が割り振られるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/4bb4bd43-e0d7-369b-1ac0-8d43230efa36.png)

また、TransformMessageオブジェクトには下図のように、
デフォルトでAPI仕様のsampleに記載したjson形式のレスポンスが設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256200/6332ccf2-faaa-e52e-c21f-c377b511bea3.png)


# まとめ
以上のようにAnypointPlatformのDesignCenterで記述したAPI仕様をベースとして、
AnypointStudioでプロジェクトを作成し、API実装ができる状態まで出来るようになりました。