DataWeave を使用してフライトデータを変換して API 仕様に一致させます。
変換用のユーザースニペットを作成する
mule-xml.json ファイルでスニペットを定義します。スニペットについての詳細は、work-with-code-snippets.adocを参照してください。
-
[Configure Snippets (スニペットを制御)] に移動します。
手順を表示
-
デスクトップ IDE で、[Code (コード)] > [Settings (設定)] > [Configure Snippets (スニペットを設定)] を選択する。
-
クラウド IDE で、
(メニュー) アイコンをクリックし、[Preferences (プリファレンス)] > [Configure Snippets (スニペットを設定)] を選択する。 -
いずれかの IDE で次の操作を実行する。
-
キーボードショートカットを使用してコマンドパレットを開く。
-
Mac: Cmd+Shift+p
-
Windows: Ctrl+Shift+p
-
-
次のコマンドを選択する。
Snippets: Configure Snippets
-
-
-
開いた [Select Snippets File or Create Snippets (スニペットファイルを選択またはスニペットを作成)] 項目で、次を入力します。
mule-xml.json (Mule XML) -
ファイルに設定が含まれていない場合、
mule-xml.json では、中括弧内にコメントが提供されます。{ // Place your snippets for mule-xml here. Each snippet is defined under a snippet name and has a prefix, body and // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are: // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the // same ids are connected. // Example: // "Print to console": { // "prefix": "log", // "body": [ // "console.log('$1');", // "$2" // ], // "description": "Log output to console" // } } -
ファイルに次のスニペットコードを追加します。
{ "Transform Message": { "prefix": "muledx:transform-message", "body": [ "<ee:transform doc:name=\"${1:Transform Message}\" doc:id=\"$RANDOM_HEX-$RANDOM_HEX\">", " <ee:message>", " <ee:set-payload>", " <![CDATA[${2:DataWeave}]]>", " </ee:set-payload>", " </ee:message>", "</ee:transform>" ] }, "Mule Flow": { "prefix": "muledx:flow", "body": [ "<flow name=\"${1:$TM_FILENAME_BASE-Flow}\" doc:id=\"$RANDOM_HEX-$RANDOM_HEX\">", "", "</flow>" ] }, "HTTP Listener Config": { "prefix": "muledx:http-listener-config", "body": [ "<http:listener-config name=\"${1:httpListenerConfig}\" doc:name=\"${2:Listener Config}\" doc:id=\"$RANDOM_HEX-$RANDOM_HEX\">", " <http:listener-connection host=\"${3:Host}\" port=\"${4:Port}\"/>", "</http:listener-config>" ] }, "HTTP Listener": { "prefix": "muledx:http-listener", "body": [ "<http:listener path=\"/${1:path}\" config-ref=\"${2:httpListenerConfig}\" doc:name=\"${3:Listener}\" doc:id=\"$RANDOM_HEX-$RANDOM_HEX\"/>" ] }, "Set Payload": { "prefix": "muledx:set-payload", "body": [ "<set-payload value=\"${1:#[payload]}\" doc:name=\"${2:Set Payload}\" doc:id=\"$RANDOM_HEX-$RANDOM_HEX\"/>" ] }, "Set Variable": { "prefix": "muledx:set-variable", "body": [ "<set-variable variableName=\"${1:name}\" value=\"${2:#[payload]}\" doc:name=\"${3:Set Variable}\" doc:id=\"$RANDOM_HEX-$RANDOM_HEX\"/>" ] }, "Logger": { "prefix": "muledx:logger", "body": [ "<logger level=\"INFO\" message=\"${1:#[payload]}\" doc:name=\"${2:Logger}\" doc:id=\"$RANDOM_HEX-$RANDOM_HEX\"/>" ] }, "Database Config - MySQL": { "prefix": "muledx:db-config-mysql", "body": [ "<db:config name=\"${1:DatabaseConfig}\" doc:name=\"${2:mySQL DB}\" doc:id=\"$RANDOM_HEX-$RANDOM_HEX\">", " <db:my-sql-connection host=\"${3:Host}\" port=\"${4:Port}\" user=\"${5:Username}\" password=\"${6:Password}\" database=\"${7:DatabaseName}\" />", "</db:config>" ] }, "Database Select": { "prefix": "muledx:db-select", "body": [ "<db:select config-ref=\"${1:DatabaseConfigRef}\" doc:name=\"${2:Select}\" doc:id=\"$RANDOM_HEX-$RANDOM_HEX\">", " <db:sql>", " <![CDATA[${3:SQL}]]>", " </db:sql>", "</db:select>" ] } }このスニペットでは、Transform Message を含めいくつかの Mule コンポーネントの開始設定が提供されます。
-
ペイロードを JSON として返すに進みます。
ペイロードを JSON として返す
-
Anypoint Code Builder で
american-ws-anypoint-code-builder.xml を開きます。 -
キャンバスで、Database Select 操作の下にスニペット
[Transform Message (メッセージを変換)] を挿入します。リスナーの後で
([Add component (コンポーネントを追加)]) アイコンをクリックして、[Snippets (スニペット)] > [User Snippets (ユーザースニペット)] > [Transform Message (メッセージを変換)] に移動します。最初に [User Snippets (ユーザースニペット)] パネルが空になっている場合、しばらく待ってからもう一度試します。または、設定 XML から
muledx:transform-message スニペットに移動します。
ユーザースニペット XML:<ee:transform doc:name="" doc:id="51fed3-afee8c"> <ee:message> <ee:set-payload> <![CDATA[]]> </ee:set-payload> </ee:message> </ee:transform> -
設定 XML で
doc:name の値 [Transform Message] (メッセージを変換) または同様の値を <ee:transform/> コンポーネントに追加します。<ee:transform doc:name="Transform Message" doc:id="423214-fac9c4"> ...
-
<![CDATA[]]> 内で、メッセージペイロードを JSON 形式に出力する DataWeave スクリプトを追加します。<ee:transform doc:name="Transform Message" doc:id="51fed3-afee8c"> <ee:message> <ee:set-payload> <![CDATA[ %dw 2.0 output application/json --- payload ]]> </ee:set-payload> </ee:message> </ee:transform> -
[Run (実行)] > [Start Debugging F5 (デバッグを開始 F5)] を選択して、アプリケーションを IDE 内にデプロイします。
詳細は、「デバッグモードでアプリケーションを実行する」を参照してください。
-
アプリケーションが正常にデプロイされたら、REST クライアントまたはブラウザーを使用して応答をトリガーします。
詳細は、「アプリケーションのテスト」を参照してください。
-
MySQL データベースからの応答データを参照します。次に例を示します。
[ { "planeType": "Boeing 787", "code2": "0001", "takeOffDate": "2016-01-20T00:00:00", "code1": "rree", "fromAirport": "MUA", "price": 541, "seatsAvailable": 0, "toAirport": "LAX", "ID": 1, "airlineName": "American Airlines", "totalSeats": 200 }, ... ]完全な応答を表示するには、クリックしてください。
[ { "planeType": "Boeing 787", "code2": "0001", "takeOffDate": "2016-01-20T00:00:00", "code1": "rree", "fromAirport": "MUA", "price": 541, "seatsAvailable": 0, "toAirport": "LAX", "ID": 1, "airlineName": "American Airlines", "totalSeats": 200 }, { "planeType": "Boeing 747", "code2": "0123", "takeOffDate": "2016-01-25T00:00:00", "code1": "eefd", "fromAirport": "MUA", "price": 300, "seatsAvailable": 7, "toAirport": "CLE", "ID": 2, "airlineName": "American Airlines", "totalSeats": 345 }, { "planeType": "Boeing 777", "code2": "0192", "takeOffDate": "2016-01-20T00:00:00", "code1": "ffee", "fromAirport": "MUA", "price": 300, "seatsAvailable": 0, "toAirport": "LAX", "ID": 3, "airlineName": "American Airlines", "totalSeats": 300 }, { "planeType": "Boeing 737", "code2": "1000", "takeOffDate": "2016-01-20T00:00:00", "code1": "rree", "fromAirport": "MUA", "price": 200, "seatsAvailable": 5, "toAirport": "CLE", "ID": 4, "airlineName": "American Airlines", "totalSeats": 150 }, { "planeType": "Boeing 737", "code2": "1093", "takeOffDate": "2016-02-11T00:00:00", "code1": "rree", "fromAirport": "MUA", "price": 142, "seatsAvailable": 1, "toAirport": "SFO", "ID": 5, "airlineName": "American Airlines", "totalSeats": 150 }, { "planeType": "Boeing 787", "code2": "1112", "takeOffDate": "2016-01-20T00:00:00", "code1": "ffee", "fromAirport": "MUA", "price": 954, "seatsAvailable": 100, "toAirport": "CLE", "ID": 6, "airlineName": "American Airlines", "totalSeats": 200 }, { "planeType": "Boeing 777", "code2": "1994", "takeOffDate": "2016-01-01T00:00:00", "code1": "eefd", "fromAirport": "MUA", "price": 676, "seatsAvailable": 0, "toAirport": "SFO", "ID": 7, "airlineName": "American Airlines", "totalSeats": 300 }, { "planeType": "Boeing 737", "code2": "2000", "takeOffDate": "2016-02-20T00:00:00", "code1": "ffee", "fromAirport": "MUA", "price": 300, "seatsAvailable": 30, "toAirport": "SFO", "ID": 8, "airlineName": "American Airlines", "totalSeats": 150 }, { "planeType": "Boeing 737", "code2": "3000", "takeOffDate": "2016-02-01T00:00:00", "code1": "eefd", "fromAirport": "MUA", "price": 900, "seatsAvailable": 0, "toAirport": "SFO", "ID": 9, "airlineName": "American Airlines", "totalSeats": 150 }, { "planeType": "Boeing 777", "code2": "4511", "takeOffDate": "2016-01-15T00:00:00", "code1": "eefd", "fromAirport": "MUA", "price": 900, "seatsAvailable": 100, "toAirport": "LAX", "ID": 10, "airlineName": "American Airlines", "totalSeats": 300 }, { "planeType": "Boeing 737", "code2": "4567", "takeOffDate": "2016-01-20T00:00:00", "code1": "rree", "fromAirport": "MUA", "price": 456, "seatsAvailable": 100, "toAirport": "SFO", "ID": 11, "airlineName": "American Airlines", "totalSeats": 150 } ]MySQL テストサーバーを使用できない場合、このエラーが発生します。
Cannot get connection for URL jdbc:mysql://mudb.learn.mulesoft.com:3306/ : Communications link failure.
問題に対処するには、正常な応答を取得するまで再試行します。
-
応答データの変換に進みます。
応答データの変換
JSON 出力を API 仕様で必要とされる構造に変換します。
Anypoint Exchange の American Flights API のフライトデータで使用する構造は、データベースへの要求で返される構造とは異なります。
必要な JSON 構造を見つけるは、/flights エンドポイントへの GET メソッドの下で JSON の例を検索します。詳細は、「Exchange で API を見つける」を参照するか、 Exchange で API の公開バージョンを開いてください。
| API 仕様の応答の構造 | 実際の応答の構造 |
|---|---|
|
|
DataWeave を使用して応答を変換します。
-
設定 XML で
<![CDATA]]> 内のスクリプトを DataWeave マッピングに置き換えます。<ee:transform doc:name="Transform Message" doc:id="51fed3-afee8c"> <ee:message> <ee:set-payload> <![CDATA[ %dw 2.0 output application/json --- payload map ( payload01 , indexOfPayload01 ) -> { ID: payload01.ID, code: (payload01.code1 default "") ++ (payload01.code2 default ""), price: payload01.price default 0, departureDate: payload01.takeOffDate as String default "", origin: payload01.fromAirport default "", destination: payload01.toAirport default "", emptySeats: payload01.seatsAvailable default 0, plane: { "type": payload01.planeType default "", totalSeats: payload01.totalSeats default 0 } } ]]> </ee:set-payload> </ee:message> </ee:transform> -
設定 XML を確認します。
<http:listener-config name="inbound-request" doc:name="HTTP Config"> <http:listener-connection host="0.0.0.0" port="8081" /> </http:listener-config> <db:config name="Database_Config" doc:name="mySQL DB"> <db:my-sql-connection host="mudb.learn.mulesoft.com" port="3306" user="mule" password="mule" database="training" /> </db:config> <flow name="getFlights"> <http:listener path="flights" config-ref="inbound-request" doc:name="HTTP /flights" /> <db:select doc:name="Query Flights" config-ref="Database_Config" > <db:sql> <![CDATA[Select * FROM american]]> </db:sql> </db:select> <ee:transform doc:name="Transform Message"> <ee:message > <ee:set-payload > <![CDATA[ %dw 2.0 output application/json --- payload map ( payload01 , indexOfPayload01 ) -> { ID: payload01.ID, code: (payload01.code1 default "") ++ (payload01.code2 default ""), price: payload01.price default 0, departureDate: payload01.takeOffDate as String default "", origin: payload01.fromAirport default "", destination: payload01.toAirport default "", emptySeats: payload01.seatsAvailable default 0, plane: { "type": payload01.planeType default "", totalSeats: payload01.totalSeats default 0 } } ]]> </ee:set-payload> </ee:message> </ee:transform> </flow> -
アプリケーションを実行してテストするに進みます。
アプリケーションを実行してテストする
-
[Run (実行)] > [Start Debugging F5 (デバッグを開始 F5)] を実行して、アプリケーションを IDE 内にデプロイします。
詳細は、「デバッグモードでアプリケーションを実行する」を参照してください。
-
アプリケーションが正常にデプロイされたら、REST クライアントまたはブラウザーを使用してフローをトリガーします。
詳細は、「アプリケーションのテスト」を参照してください。
変換されたデータ構造が API 要件に準拠していることを確認します。次に例を示します。
[ { "ID": 1, "code": "rree0001", "price": 541, "departureDate": "2016-01-20T00:00:00", "origin": "MUA", "destination": "LAX", "emptySeats": 0, "plane": { "type": "Boeing 787", "totalSeats": 200 } }, ...完全な応答を表示するには、クリックしてください。
[ { "ID": 1, "code": "rree0001", "price": 541, "departureDate": "2016-01-20T00:00:00", "origin": "MUA", "destination": "LAX", "emptySeats": 0, "plane": { "type": "Boeing 787", "totalSeats": 200 } }, { "ID": 2, "code": "eefd0123", "price": 300, "departureDate": "2016-01-25T00:00:00", "origin": "MUA", "destination": "CLE", "emptySeats": 7, "plane": { "type": "Boeing 747", "totalSeats": 345 } }, { "ID": 3, "code": "ffee0192", "price": 300, "departureDate": "2016-01-20T00:00:00", "origin": "MUA", "destination": "LAX", "emptySeats": 0, "plane": { "type": "Boeing 777", "totalSeats": 300 } }, { "ID": 4, "code": "rree1000", "price": 200, "departureDate": "2016-01-20T00:00:00", "origin": "MUA", "destination": "CLE", "emptySeats": 5, "plane": { "type": "Boeing 737", "totalSeats": 150 } }, { "ID": 5, "code": "rree1093", "price": 142, "departureDate": "2016-02-11T00:00:00", "origin": "MUA", "destination": "SFO", "emptySeats": 1, "plane": { "type": "Boeing 737", "totalSeats": 150 } }, { "ID": 6, "code": "ffee1112", "price": 954, "departureDate": "2016-01-20T00:00:00", "origin": "MUA", "destination": "CLE", "emptySeats": 100, "plane": { "type": "Boeing 787", "totalSeats": 200 } }, { "ID": 7, "code": "eefd1994", "price": 676, "departureDate": "2016-01-01T00:00:00", "origin": "MUA", "destination": "SFO", "emptySeats": 0, "plane": { "type": "Boeing 777", "totalSeats": 300 } }, { "ID": 8, "code": "ffee2000", "price": 300, "departureDate": "2016-02-20T00:00:00", "origin": "MUA", "destination": "SFO", "emptySeats": 30, "plane": { "type": "Boeing 737", "totalSeats": 150 } }, { "ID": 9, "code": "eefd3000", "price": 900, "departureDate": "2016-02-01T00:00:00", "origin": "MUA", "destination": "SFO", "emptySeats": 0, "plane": { "type": "Boeing 737", "totalSeats": 150 } }, { "ID": 10, "code": "eefd4511", "price": 900, "departureDate": "2016-01-15T00:00:00", "origin": "MUA", "destination": "LAX", "emptySeats": 100, "plane": { "type": "Boeing 777", "totalSeats": 300 } }, { "ID": 11, "code": "rree4567", "price": 456, "departureDate": "2016-01-20T00:00:00", "origin": "MUA", "destination": "SFO", "emptySeats": 100, "plane": { "type": "Boeing 737", "totalSeats": 150 } } ] -
アプリケーションを停止します。
詳細は、「アプリケーションを停止する」を参照してください。