
ラボ 2: Order Fulfillment APIを実装し、プロセス層の API を作成
概要
注文を処理するためのバックエンドシステムを編成してみましょう。注文をOrder APIに送信します。

実装はいくつかのステップで構成されています。
-
前のラボで生成したOrder Fulfillment API スタブを拡張します。
-
Scatter Gatherなどのフローコントロールを使用して、このプロセスAPIのオーケストレーションを実行します。
-
Order API を呼び出して Order を作成します。
-
ユーザデータを取得するためにCustomer APIを呼び出します。
-
DataWeave変換を使用して、システムAPIリクエストから集約されたプロセスAPIレスポンスメッセージを構築します。
-
Anypoint StudioからプロセスAPIを含むMuleアプリを実行してテストします。
ステップ 1: プロセスAPIのPOSTフローを設定
まず、post:\order_fulfillment:application\json:order-fulfillment-api-config バックエンド・フローを実装します。
-
Anypoint Studioのフローダイアグラムに戻り、post:\order_fulfillment:applicationjson:order-fulfillment-api-config というフローから、Transform Messageをクリックします。
-
Transformコンポーネントを削除し、scatter gatherを追加します。
Scatter-Gather は、複数のターゲットに同時にリクエストメッセージを送信します。 すべてのルートからの応答を収集し、1つのメッセージに集約します。
ステップ 2: 設定ファイルの作成
設定ファイルを使用して、プロジェクトの設定を簡単に行えるようにしたいと思います。 そのために、このラボで使用するプロパティを設定した yaml ファイルを作成します。
-
メニューより File → New → File へ移動します。
Enter or select the parent folder: で api-order-fulfillment/src/main/resources フォルダを選択し、 File name: をconfiguration.yaml
とします。api-order-fulfillment/src/main/resources フォルダに作成されていることを確認してください。
-
Finish を押します。
-
次の値をコピーして貼り付けます。
system: api: host: customers: mythical-customer-api-v4-0.cloudhub.io orders: mythical-order-api-v4-1.us-e1.cloudhub.io
YAMLを使う利点の1つは、1つのYAMLファイル内の情報を複数の言語タイプに簡単に翻訳できることです。
-
api.raml ファイルで、Global Elements タブに移動します。
-
Create ボタンを押します。
-
Configuration
でフィルタし、 Configuration properties を選択します。 -
OK を押します。
-
Fileプロパティを
configuration.yaml
という値で完成させます。 -
OKを押します。
ステップ 3: Order API - Connectorの使用
REST API モデリング言語(RAML)を定義に使用している Order API を呼び出すことから始めます。 RAML仕様を作成してExchangeに公開するたびに、新しいコネクタが生成されます。このモジュールをプロジェクトに追加する必要があります。
Exchange の API 定義を確認して、Order API をプレビューします。
-
Exchange Icon をクリックします。
必要に応じて自分の資格情報でログインします。
-
組織名で「Order API」を検索します。
-
Order APIをクリックして、APIポータルを探索します。
-
POSTメソッドのリクエストとレスポンスボディの仕組みを詳しく見てみましょう。
-
Add to project をクリックします。
-
警告のポップアップウィンドウが表示されますので Proceed を押します。
インポートが成功したことを知らせるウィンドウが表示されます。
OK を押すと、Order API モジュールがパレットで使用できるようになります。
コネクタのバージョンが変わることがありますが最新のバージョンであることを確認してください。 -
ドラッグ&ドロップで Order API から Create order を配置します。
-
コネクタをダブルクリックして、プロパティを表示します。Mule Properties View に、構成するコンポーネントのプロパティが表示されます。
-
アイコンをクリックして、以下のように新しい設定を作成します。:
-
リクエスト設定の完成
-
Host:
mythical-order-api-v4-1.us-e1.cloudhub.io
-
Port:
80
-
Base Path:
/api
-
Protocol:
HTTP
Host の値はconfiguration.yamlファイルで設定できるので、${system.api.host.orders}とすることもできます。
Response timeout の値が10000(ミリ秒単位)であることに注目してください。つまり、このAPIへのすべての呼び出しのタイムアウトは10秒です。必要に応じてこの値を調整してください。
プロトコルを確認してください。デフォルトでは HTTPS となっていますが、今回のサービスは HTTP です。
-
-
OK をクリックします。
-
General セクションでは、以下のパラメータを設定します:
-
Create order request data:
#[payload]
-
Client id:
11def1b704e24d87a5ea5769772c90a7
-
Client secret:
88845E529f1F42E4a5aC96Fd504c3e01
-
Content type:
application/json
-
Accept:
application/json
設定は以下のようになるはずです:
をクリックして、フィールドごとのマッピングを行います。
-
-
Create order request data: ボックスからpayloadを削除し、
{}
を追加します。 -
Refresh Metadata ボタンを押します。
-
ボタンをクリックしして、RAML Consumersの入出力メッセージを変換します。
-
Order Fulfillment APIのPOST呼び出しのフィールドを、Order APIのPOST呼び出しに必要なフィールドにマッピングします。次のDataWeaveスクリプトをDataWeaveコードエディタに貼り付けます。:
{ customerId: payload.customer_id, orderLineItems: (payload.products default []) map ( product , indexOfProduct ) -> { productId: product.id, quantitySafetyStock: product.quantity, quantitiyOnHand: product.quantity, productName: product.productName }, status: payload.status, totalPrice: payload.price as String }
-
マッピングは以下のように表示されるはずです。
ボタンを押します。
元のペイロードを変更したくないので、Order Idを変数に保存します。
Create Order の設定にいない場合は、コネクタをクリックしてその設定にフォーカスします。
-
Advance タブに移動します。
-
以下のデータで表を完成させます:
-
Name: Expression Value
-
Target Variable:
order_id
-
Target Value:
#[payload.id]
ExchangeでAPI仕様を確認したので、出力が判ります。また、OutputタブからPayloadツリーで確認することもできます。
-
-
コンポーネントパレットで "Business" を検索します。
-
Connectorコンポーネントの後に、Custom Business Event コネクタをキャンバスにドラッグ&ドロップします。
-
Custom Business Event アイコンをダブルクリックして、そのプロパティを表示します。Mule Properties View に、設定するコンポーネントのプロパティが表示されます。
-
Display Name(表示名)」と Event Name(イベント名)フィールドに、Order Created Eventのように、操作が判る名前を追加します。
-
Key Performance Indicators セクションで、
をクリックして、以下のKPIを追加します:
-
Name: Expression Value
-
Order id: #[vars.order_id]
-
Order Price: #[payload.price]
-
Customer ID: #[payload.customer_id]
-
Order Status: #[payload.status]
-
ステップ 4: Customer API - Connectorの使用
次に、Customer API を呼び出して、顧客に関する追加情報を取得します。ここでもプロジェクトに REST connector を追加します。 この場合、Get By ID リソースを使用します。
-
Exchange のポータルを見て、Customer API をプレビューします。
-
Customers → GET に移動し、レスポンスを見てみましょう。
-
Add to project ボタンをクリックします。
-
Order API Connectorをインポートするために行ったのと同じ手順となります。
最後に、Customer API モジュールがパレットで使用できるようになります。
コネクタのバージョンが変わることがありますが最新のバージョンであることを確認してください。 -
Customer API コネクタから Get customer by id をドラッグ アンド ドロップします。
-
コネクタをダブルクリックして、プロパティを表示すると、Mule Properties View に設定するコンポーネントのプロパティが表示されます。
-
アイコンをクリックして、図のように新しい設定を作成します:
-
Customer API で使用する HTTP 構成を定義します。
-
次の値を入力してください:
-
Host:
mythical-customer-api-v4-0.cloudhub.io
-
Port:
80
-
Base Path:
/api
-
Protocol:
HTTP
Host の値はconfiguration.yamlファイルで設定できるので、${system.api.host.customers}とすることもできます。 Response timeout の値が10000(ミリ秒単位)であることに注目してください。つまり、このAPIへのすべての呼び出しのタイムアウトは10秒です。必要に応じてこの値を調整してください。
-
-
OK をクリックします。
-
General セクションでは、以下のパラメータを設定します:
-
Name: Expression Value
-
Id:
#[payload.customer_id]
-
Client id:
11def1b704e24d87a5ea5769772c90a7
-
Client secret:
88845E529f1F42E4a5aC96Fd504c3e01
-
Content Type:
application/json
-
Accept:
application/json
設定は以下のようになるはずです:
-
-
最後に、Scatter-Gather の後に Transform Message コンポーネントを追加してAPIレスポンスを構築します。
-
Transform Message コンポーネントをダブルクリックします。
-
以下のDataweaveスクリプトを貼り付けます。
%dw 2.0 output application/json --- { order_id: vars.order_id as Number, username: payload."1".payload.name default "" }
このラボの目的はDataWeaveの詳細を説明することではありませんが、Scatter-Gather の後にペイロードの配列を作成します。 payload."0".payload というのは、最初のブランチからのペイロードから値を取得していることを意味します。
最終的には以下のようなフローとなるはずです。
ステップ 5: APIの実行
それでは、Anypoint Studio でAPIを実行して、どのように連携して動作するかを確認してみましょう。
-
前のラボで行ったように、アプリケーションを起動します。(アプリケーションを右クリックし、Run As > Mule application 選択します。
-
Anypoint Studioで API Console View が開いたら、リンクをクリックします。
-
リクエストボディへ移動し、 Send ボタンをクリックします。
Accept ヘッダーの値に application/json が選択されていることを確認してください。
-
リクエストが処理されると、200 番のレスポンスコードとAPIのJSONレスポンスが表示されるはずです。
404 レスポンスが返ってくることがあります。これは、そのユーザーIDが存在しないことを意味します。
まとめ
このラボでは
-
Anypoint Studioを使用して、Order Fulfillment Stubを実装してプロセスAPIレイヤーを完成させました。
-
Scatter-Gatherフロー・コントロールとRAML Consumerオブジェクトを構成して、注文と顧客システムAPIをオーケストレーションしました。
-
DataWeaveを使用して、システムとAPIのレスポンスを管理し、目的の結果セットを生成します。
-
RAMLコンシューマからのライブAPIコールを使用して、システムAPIレイヤを横断するプロセスAPI実装をテストしました。
詳細はこちらをご覧ください:
-
詳細については、 Rest Connectors を参照してください。
-
詳細については、 Scatter-Gather ルータ を参照してください。
-
詳細については、 Dataweave を参照してください。
-
詳細については、 ビジネスイベント を参照してください。
おめでとうございます! ラボ 2が完了しました。
ラボ 3に進んでください。