Flex Gateway新着情報
Governance新着情報
Monitoring API ManagerHTTP 用 Anypoint Connector (HTTP Connector) の Listener ソースでは、HTTP サーバーをセットアップして、HTTP 要求を受信したらフローをトリガーすることができます。
ソースが受け入れるメソッド (GET
、POST
やメソッドのリスト) を選択できます。HTTP 要求を受信するパスも選択できるため、さまざまなフローを使用して要求を転送することができます。
HTTP 要求を受信すると、HTTP Listener ソースは要求データを使用してフローをトリガーします。HTTP 本文はペイロードとして設定され、ヘッダーやクエリパラメーターなどの残りの HTTP データは属性として設定されます。
フローの実行終了後、HTTP Listener ソースはフロー実行が成功かどうかに基づいて異なる状況コードを返す HTTP 応答を送信します。また、ソースによって HTTP 応答がどのように生成されるかをコネクタのソース設定でカスタマイズすることができます。
HTTP Listener ソースを使用するには、次の設定を使用して接続を定義する必要があります。
Host (ホスト)
要求が受信される場所を示します。ホスト名 (localhost
など)、www.mulesoft.com
、IP (127.0.0.1
、::1
など) を指定できます。
Port (ポート)
要求が受信される場所を示します。
Protocol (プロトコル)
通信のプロトコルを示します。プレーンな接続の場合は HTTP、セキュアな TLS 接続の場合は HTTPS を使用します。
HTTPS を介したセキュアな接続を有効にするには、接続に TLS コンテキストを定義し、次を指定する必要があります。
サーバーのキーストア
トラストストア (相互認証が必要な場合)
TLS 設定についての詳細は、「キーストアとトラストストアを使用した TLS の設定」を参照してください。
さらに、すべての HTTP Listener ソースに適用される [Base path (ベースパス)] 項目を設定できます。
次の例は、Studio で HTTP Listener 接続を設定する方法を示しています。
[Mule Palette (Mule パレット)] ビューで、[HTTP] > [Listener] を選択します。
[Listener] を Studio キャンバスにドラッグします。
[Path (パス)] を /path
に設定します。
[Connector configuration (コネクタ設定)] 項目の横にあるプラス記号 (+) をクリックして、アプリケーション内の HTTP Listener のすべてのインスタンスで使用できるグローバル要素を設定します。
[Host (ホスト)] を 0.0.0.0
に、[Port (ポート)] を 8081
に設定します。
[TLS] タブをクリックします。
[TLS configuration (TLS 設定)] を [Edit inline (インライン編集)] に設定します。
[Trust Store Configuration (トラストストア設定)] セクションで、[Path (パス)] を keystore.jks
に、[Password (パスワード)] を MyP455W0rD
に設定します。
[OK] をクリックします。
設定 XML エディターでは、host
、port
、path
、および trust-store
の設定は次のように記述されます。
<http:listener-config name="HTTP_Listener_config" >
<http:listener-connection host="0.0.0.0" port="8081" >
<tls:context >
<tls:trust-store path="keystore.jks" password="MyP455W0rD" />
</tls:context>
</http:listener-connection>
</http:listener-config>
<flow name="test" >
<http:listenerconfig-ref="HTTP_Listener_config" path="/path"/>
</flow>
ソースの [Base path (ベースパス)] 項目を設定する手順は、次のとおりです。
HTTP Listener 設定画面で、[Connector configuration (コネクタ設定)] 項目の横にあるプラス記号 (+) をクリックしてグローバル要素を設定します。
[HTTP Listener config (HTTP リスナー設定)] で、[Base path (ベースパス)] を api/v1
に設定します。
[OK] をクリックします。
設定 XML エディターでは、basePath
設定は次のように記述されます。
<http:listener-config name="HTTP_Listener_config" basePath="api/v1">
<http:listener-connection host="0.0.0.0" port="8081" />
</http:listener-config>
プロジェクトを CloudHub にデプロイする場合、マシンのすべてのインスタンスをリスンするように [Host (ホスト)] を 0.0.0.0 に設定する必要があります。 テスト目的でローカルにデプロイする場合は、ローカルに生成された要求のみを受信するように [Host (ホスト)] を localhost に設定します。アプリケーションが外部の脅威から攻撃を受けにくくなります。 |
また、高度な設定で、接続が永続的かどうかも定義できます。永続的ではない場合、タイムアウトが設定されます。
HTTP Listener ソースは、フロー内のイベントトリガーとして機能するため、使用する設定と、HTTP 要求をリスンするパスを参照する必要があります。
パスは、静的 (完全一致が必要) にするか、機能のプレースホルダーを使用できます。プレースホルダーには次を使用できます。
ワイルドカード (*
)
比較対象の一部または全部と一致します。パスの末尾にワイルドカードを使用すると、未管理のリソースへの要求を取得してより適切なエラーメッセージを表示するのに役立ちます。
パラメーター ({param}
)
比較対象の一部または全部と一致するだけでなく、URI パラメーターマップ上のそれらの値も取得します。
次の例は、3 つの HTTP Listener ソースの異なるパスの設定を示しています。パスは [Path (パス)] 項目で定義されており、[Base path (ベースパス)] 項目は api/v1
に設定されています。
account/mulesoft/main-contact
パス要求 http://awesome-company.com/api/v1/account/mulesoft/main-contact
とのみ完全一致します。
account/{accountId}/main-contact
類似の構造を持つすべてのパス要求 (http://awesome-company.com/api/v1/account/salesforce/main-contact
など) と一致し、salesforce
を accountId
の値として保存します。
account/{accountId}/*
main-contact
とは異なるすべてのパス要求 (http://awesome-company.com/api/v1/account/mulesoft/users
など) と一致し、mulesoft
を accountId
の値として保存します。
Mule アプリケーションに複数の HTTP Listener ソースがある場合、HTTP 要求は常に最も具体的なソースに転送されます。上記の例では、最初の HTTP Listener ソースは accountId: mulesoft
とサフィックス main-contact
を含む要求を受信し、2 番目のソースは異なる accountId
値を受信します。
HTTP 要求は、受信した HTTP メソッドに基づいて転送されます。デフォルトでは、HTTP Listener ソースはすべてのメソッドをサポートしますが、使用可能なメソッドを制限でき、カスタムメソッドを設定することもできます。
次の例は、Studio で [Allowed methods (許可されるメソッド)] 項目を設定する方法を示しています。
[Mule Palette (Mule パレット)] ビューで、[HTTP] > [Listener] を選択します。
[Listener] を Studio キャンバスにドラッグします。
HTTP Listener ソース設定画面で、[Advanced (詳細)] タブをクリックします。
[Allowed Methods (許可されるメソッド)] を GET
に設定します。
設定 XML エディターでは、allowedMethods
設定は次のように記述されます。
<http:listener path="/test" allowedMethods="GET" config-ref="HTTP_Listener_config"/>
Mule アプリケーションに複数の HTTP Listener ソースがある場合、要求はメソッドと最初に一致したソースに転送されるため、デフォルトのソースは常に最後に定義する必要があります。
次の例は、[Allowed method (許可されるメソッド)] 項目が GET
、POST
、PUT
に設定された、異なる HTTP Listener ソース設定を示しています。この異なる設定により、HTTP 要求は異なるフローに転送され、データへのユーザーアクセスを指定し、制限することができます。
<flow name="main-contact-write">
<http:listener path="account/{accountId}/main-contact" allowedMethods="POST, PUT" config-ref="HTTP_Listener_config"/>
<!-- validate user permissions -->
<!-- store or update main contact for accountId -->
</flow>
<flow name="main-contact-read">
<http:listener path="account/{accountId}/main-contact" allowedMethods="GET" config-ref="HTTP_Listener_config"/>
<!-- fetch main contact for accountId -->
</flow>
<flow name="main-contact-general">
<http:listener path="account/{accountId}/main-contact" config-ref="HTTP_Listener_config"/>
<set-payload value="#['The main contact resource does not support ' ++ attributes.method ++ ' requests.']"
</flow>
HTTP Connector は、レスポンスボディの管理時に本文のサイズが明らかではない場合、送信するデータの種類を考慮し、chunked エンコードを使用します。これによりサイズ情報のないストリームとなります。
この動作を制御するには、[Response streaming mode (応答ストリーミングモード)] 項目を次のいずれかのオプションに設定します。
AUTO (デフォルト)
本文のサイズが定義されている場合、Content-Length
エンコードを使用します。定義されていない場合は Transfer-Encoding: chunked
を使用します。
ALWAYS
存在するサイズデータに関係なく Transfer-Encoding: chunked
を使用します。
NEVER
Content-Length
エンコードを使用し、必要に応じてストリームをコンシュームしてデータサイズを判定します。
次の例は、Studio で [Response streaming mode (応答ストリーミングモード)] 項目を設定する方法を示しています。この例では、アカウントの主連絡先データは常に Content-Length
エンコードを返します。
[Mule Palette (Mule パレット)] ビューで、[HTTP] > [Listener] を選択します。
[Listener] を Studio キャンバスにドラッグします。
[Path (パス)] を account/{accountId}/main-contact
に設定します。
HTTP Listener ソース設定画面で、[Advanced (詳細)] タブをクリックします。
[Allowed Methods (許可されるメソッド)] を GET
に設定します。
[Response streaming mode (応答ストリーミングモード)] を NEVER
に設定します。
[Configuration XML (設定 XML)] エディターで、allowedMethods
および responseStreamingMode
の設定は次のように記述されます。
<flow name="main-contact-read">
<http:listener path="account/{accountId}/main-contact" allowedMethods="GET" responseStreamingMode="NEVER" config-ref="HTTP_Listener_config"/>
<!-- fetch main contact for accountId -->
</flow>
読み取りタイムアウトとは、HTTP Listener ソースが読み取りタイムアウト (ミリ秒) が経過してもデータを読み取らない場合、コネクタでタイムアウトエラーが発生することを意味します。[Read timeout (読み取りタイムアウト)] 項目を使用して、クライアントが次のような HTTP 要求を送信しないようにします。
POST /test HTTP/1.1
Host: localhost:8081
Content-Length: 10000
2
読み取りタイムアウトを指定しないと、Listener ソースはデータをいつまでも待機するため、接続が解放されません。[Read timeout (読み取りタイムアウト)] 項目はデフォルトで 30000 に設定されます。時間単位はミリ秒です。
ソースの読み取りタイムアウトを設定するには、HTTP Listener 設定ウィンドウで [Read timeout (読み取りタイムアウト)] 項目を目的の値に設定します。
設定 XML エディターでは、readTimeout
設定は次のように記述されます。
<http:listener-config >
<http:listener-connection host="0.0.0.0" port="8081" readTimeout="30000" />
</http:listener-config>
RFC7230 と RFC2616 に基づいて有効な Transfer-Encoding ヘッダーは chunked
、deflate
、compress
、identity
、gzip
です。これらのヘッダーでは大文字と小文字は区別されません。
無効な Transfer-Encoding ヘッダーを含む要求を拒否するには、HTTP Listener 設定ウィンドウで [Reject invalid transfer encoding (無効な転送エンコードを拒否)] チェックボックスをオンにします。
設定 XML エディターでは、rejectInvalidTransferEncoding
設定は次のように記述されます。
<http:listener-config rejectInvalidTransferEncoding="true">
<http:listener-connection host="0.0.0.0" port="8081" readTimeout="3000" />
</http:listener-config>
HTTP Listener ソースが HTTP 要求を受信すると、HTTP 要求行からのデータにはメソッド、要求パス、クエリ、URI パラメーター、ヘッダーが属性として含まれます。本文はペイロードを設定し、Content-Type
ヘッダーは MIME タイプを設定します。これにより、他のコンポーネントがペイロードの MIME タイプを検査できます。たとえば、DataWeave では HTTP ペイロードを使用するのに入力情報を必要としません。HttpRequestAttributes
構文を使用してヘッダー、クエリパラメーターなどの属性を参照できます。
HTTP 要求を設定するときに、Content-Type
ヘッダーを設定しないでください。Mule Runtime Engine は、メッセージペイロードからヘッダーを自動的に推定します。multipart/form-data
形式のペイロードで Content-Type
ヘッダーを設定すると、HTTP 要求は 400 エラー状況で失敗します。
さらに、HTTP 要求に X-Correlation-ID
ヘッダーまたは MULE_CORRELATION_ID
ヘッダー (Mule 3 との相互運用目的) のいずれかが含まれている場合、トレーサビリティ目的でメッセージの相関 ID が設定されます。
次の例は、HTTP 要求を示しています。
POST api/v1/account/salesforce/main-contact?overwrite=true¬ify=jane.doe¬ify=admin HTTP/1.1
Host: localhost:8081
Content-Type: application/json
Content-Length: 166
X-Correlation-ID: 9cf32672-4f0b-4e8b-b988-40c13aae85b4
{
"name": "John",
"surname": "Doe",
"role": "Senior Vice President",
"organization": "Marketing",
"phone": 701222369,
"email": "john.doe@salesforce.com"
}
メッセージの相関 ID は 9cf32672-4f0b-4e8b-b988-40c13aae85b4
です。
ペイロードは JSON 形式です:
{
"name": "John",
"surname": "Doe",
"role": "Senior Vice President",
"organization": "Marketing",
"phone": 701222369,
"email": "john.doe@salesforce.com"
}
属性は次のとおりです。
method: POST
listenerPath: api/v1/account/{accountId}/main-contact
requestPath: api/v1/account/salesforce/main-contact
relativePath: account/salesforce/main-contact
queryParams: エントリ overwrite=true
、notify=jane.doe
、notify=admin
を含むマルチマップ
uriParams: accountId ⇒ salesforce
を含むマップ
headers: エントリ Host=localhost:8081
、Content-Type=application/json
、Content-Length=166
、X-Correlation-ID=9cf32672-4f0b-4e8b-b988-40c13aae85b4
#[payload.name ' ' payload.surname]
のような DataWeave 式は John Doe
を返します。これは、DataWeave が正しく JSON データを解釈しているためです。
#['Received a ' attributes.method ' request for account ' attributes.uriParams.accountId '. The following users are notified: ' ++ (attributes.queryParams.*notify joinBy ', ')]
のような DataWeave 式は Received a POST request for account salesforce. The following users are notified: admin, jane.doe
を返します。
HTTP リスナー属性にアクセスするには、次の表に示す DataWeave 構文を使用します。
HTTP オブジェクト | Mule Runtime Engine 3.x | Mule Runtime Engine 4.x |
---|---|---|
メソッド |
#[inboundProperties.’http.method’] |
#[attributes.method] |
パス |
#[inboundProperties.’http.listener.path’] |
#[attributes.listenerPath] |
相対パス |
#[inboundProperties.’http.relative.path’] |
#[attributes.relativePath] |
要求 URI |
#[inboundProperties.’http.request.uri’] |
#[attributes.requestUri] |
クエリ文字列 |
#[inboundProperties.’http.query.string’] |
#[attributes.queryString] |
クエリパラメーター |
#[inboundProperties.’http.query.params’] |
#[attributes.queryParams] |
URI パラメーター |
#[inboundProperties.’http.uri.params’] |
#[attributes.uriParams] |
バージョン |
#[inboundProperties.’http.version’] |
#[attributes.version] |
スキーマ |
#[inboundProperties.’http.scheme’] |
#[attributes.scheme] |
ヘッダー |
#[inboundProperties] |
#[attributes.headers] |
リモートアドレス |
#[inboundProperties.’http.remote.address’] |
#[attributes.remoteAddress] |
クライアント証明書 |
#[inboundProperties.’http.client.cert’] |
#[attributes.clientCertificate] |
マルチマップは、特定のキーに対して複数の値が許可される点を除き、マップと似ています。単一値セレクター (. ) の使用時は最初の値を返しますが、複数値セレクター (.* ) の使用時はすべての値の取得が許可されます。
|
次の図は、HTTP 要求と Mule イベントへのマッピングの例を示しています。
DataWeave 言語を使用して、HTTP 要求データ属性とペイロードにアクセスします。
次の例は、HTTP Listener ソースによって受信された HTML フォームの HTTP 要求を示しています。さらに、この例は DataWeave 式を使用して multipart/form-data
コンテンツを読み取る方法を示しています。
次の HTML フォームに基づいて説明します。
<form action="http://server.com/cgi/handle"
enctype="multipart/form-data"
method="post">
How would you like to identify the logo? <INPUT type="text" name="name"><BR>
Which is the logo file? <INPUT type="file" name="logo"><BR>
What is the main color in the logo? <INPUT type="text" name="color"><BR>
<INPUT type="submit" value="Send"> <INPUT type="reset">
</form>
HTTP Listener ソースは次の multipart/form-data
HTTP 要求を受信します:
POST /api/v1/account/mulesoft/logo HTTP/1.1
Content-Type: multipart/form-data; boundary=489691234097965980223899
Host: localhost:8081
content-length: 34332
--489691234097965980223899
Content-Disposition: form-data; name="name"
Corporate Logo
--489691234097965980223899
Content-Disposition: form-data; name="logo"; filename="MuleSoft_logo.png"
Content-Type: image/png
.PNG
.
...
IHDR.......L......~..... pHYs...#...#.x.?v.. .IDATx....q.W.6.....~".N....t....t..#.....LD0T.CF0b..:.3......Q..@...q]U*y\c....
....`%.$....V"H....`%.$....V"H....`%.$....V"H....`%.$....V"H....`%.$....V"H....`%.$....V"H....`%.$....V"H....`%.$....V"H....`%
.$....V"H....`%.$....V"H....`%.$....V"H....`%.$....V"H....`%.$....V"H....`%.$....^6.......|..P.....IEND.B`.
--489691234097965980223899
Content-Disposition: form-data; name="color"
blue
--489691234097965980223899--
DataWeave 式を使用すると、parts
オブジェクトを使用して名前または項目番号で HTTP 要求の各パラメーターデータにアクセスして読み取ることができます。たとえば、Corporate Logo
パラメーターデータを含む HTTP 要求の 2 番目のパートにアクセスするには、payload.parts.logo
または payload.parts[1]
を使用できます。後者は、名前が指定されない場合に便利です。
各パート内で、そのコンテンツとヘッダーにアクセスできます。たとえば、payload.parts.color.content
は blue
を返し、payload.parts.logo.headers.'Content-Type'
は application/png
を返します。
パートのファイル名にアクセスすることもできます。たとえば、Content-Disposition
ヘッダーは解析されて payload.parts.logo.headers.'Content-Disposition'.filename
のような式を許可します。この場合は MuleSoft_logo.png
が返されます。
マルチパートコンテンツの読み取りと書き込みについての詳細は、「DataWeave でサポートされる形式」を参照してください。
トリガーされたフローの実行が完了すると、HTTP Listener ソースは次のデフォルトの結果のいずれかを送信します。
実行成功: 200 状況コードと、本文としてメッセージペイロードを含む HTTP 応答
実行失敗: 500 状況コードと、本文としてフローエラーの説明を含む HTTP エラー応答
HTTP Listener ソース設定で、次のパラメーターを指定して HTTP 応答をカスタマイズできます。
Body (本文)
Header (ヘッダー)
Status code (状況コード)
Reason phrase (理由を示す語句)
DataWeave を使用して各パラメーターのコンテンツを生成でき、変数を使用してフローからデータを伝播できます。
次の例は、Studio で HTTP Listener ソースの HTTP 応答を設定する方法を示しています。この例は、エンドポイントにアカウントのロゴを保存する Mule アプリケーションフローです。
正常に保存されると、通常の HTTP 応答は状況コード 201
、理由を示す語句 Created
、本文 Corporate Logo has been stored as a MuleSoft logo
を返します。
保存に失敗すると、HTTP エラー応答は errorCode
変数 (使用可能な場合) で定義された状況コードまたはデフォルトの 500
を返します。
カスタムヘッダーは X-Time
を返します。
本文は Corporate Logo could not be stored
を返します。
ロゴの保存時に CONNECTIVITY
エラーがある場合、返される状況コードは 504
、他のエラーはすべて 500
状況コードになります。
エラー応答の理由を示す語句が定義されていないと、HTTP Connector は状況コードに基づいて理由の語句の定義を試みます。したがって、上記で説明した HTTP 応答のシナリオでは Gateway Timeout
または Internal Server Error
エラーが返されることがあります。
Mule アプリケーションをテストするには、2 つの列 (accountId,logoName)
を含む logo
というテーブルが必要です。このテーブルは Mule を使用して作成するか、別の方法で作成することができます。たとえば、次の XML コードは、Database Connector の Execute script 操作を使用してテーブルを作成する方法を示しています。
<db:execute-script config-ref="Database_Config">
<db:sql ><![CDATA[CREATE TABLE logo (
accountId VARCHAR(255),
logoName VARCHAR(255),
PRIMARY KEY (accountId)
)]]></db:sql>
</db:execute-script>
Studio で Mule アプリケーションを作成する手順は、次のとおりです。
[Mule Palette (Mule パレット)] ビューで、[HTTP] > [Listener] を選択します。
[Listener] を Studio キャンバスにドラッグします。
[Path (パス)] を /account/{accountId}/logo
に設定します。
[Connector configuration (コネクタ設定)] 項目の横にあるプラス記号 (+) をクリックして、アプリケーション内の HTTP Listener のすべてのインスタンスで使用できるグローバル要素を設定します。
[Host (ホスト)] を 0.0.0.0
に、[Port (ポート)] を 8081
に設定します。
[OK] をクリックします。
HTTP Listener 設定画面で、[Responses (応答)] タブをクリックします。
[Response (応答)] セクションで、次の値を設定します。
Body (本文): output text/plain --- vars.logoName ' has been stored as a ' vars.accountId ++ ' logo.'
Status code (状況コード): 201
Reason phrase (理由を示す語句): Created
[Error Response (エラー応答)] セクションで、次の値を設定します。
Body (本文): vars.logoName ++ ' could not be stored.'
Header (ヘッダー):
output application/java
---
{
"X-Time" : "50s" // 4
}
Status code (状況コード): vars.errorCode default 500
。
[Set Payload] コンポーネントを [HTTP] の [Listener] の右にドラッグします。
[Name (名前)] を logoName
に設定します。
[Value (値)] を式 payload.parts.name.content
に設定します。
別の [Set Variable] コンポーネントを最初の [Set Variable] コンポーネントの右にドラッグします。
[Name (名前)] を accountId
に設定します。
[Value (値)] を式 attributes.uriParams.accountId
に設定します。
Database の [Insert] 操作を 2 番目の [Set Variable] コンポーネントの右にドラッグします。
データベース接続を設定するために、[Connector configuration (コネクタ設定)] 項目の横にあるプラス記号 (+) をクリックします。
データベース接続の設定方法についての詳細は、「データベース接続の設定」を参照してください。
Insert 操作設定画面で、[SQL Query Text (SQL クエリテキスト)] 項目を INSERT INTO logo (accountId,logoName) VALUES (:accountId, :logoName
) に設定します。
[Input parameters (入力パラメーター)] を式 {'accountId': vars.accountId as String, 'logoName': vars.logoName as String}
に設定します。
[On Error Propagate] コンポーネントをフローの [Error handling (エラー処理)] セクションにドラッグします。
[Type (種別)] を DB:CONNECTIVITY
に設定します。
[Set Variable] コンポーネントを [On Error Propagate] コンポーネントにドラッグします。
[Name (名前)] を errorCode
に設定します。
[Value (値)] を 504
に設定します。
Mule アプリケーションを保存して実行します。
次の CURL コマンドを送信します。curl -v -F 'data=@/path/to/MuleSoft_logo.svg' -F name=mulesoftlogo http://localhost:8081/account/muley/logo
。
人間が読み取るにはコンテンツが長すぎるため、完全なペイロードは非表示にされています。
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8081 (#0)
> POST /account/muley/logo HTTP/1.1
> Host: localhost:8081
> User-Agent: curl/7.64.1
> Accept: */*
> Content-Length: 5313
> Content-Type: multipart/form-data; boundary=------------------------d96e85d23101a1c3
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 201 Created
< Content-Type: text/plain; charset=UTF-8
< Content-Length: 45
< Date: Tue, 18 Jan 2022 20:30:20 GMT
<
* Connection #0 to host localhost left intact
mulesoftlogo has been stored as a muley logo.* Closing connection 0
この例のフローをすばやく Mule アプリケーションに読み込むには、次のコードを Studio XML エディターに貼り付けます。
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:os="http://www.mulesoft.org/schema/mule/os"
xmlns:http="http://www.mulesoft.org/schema/mule/http"
xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/os http://www.mulesoft.org/schema/mule/os/current/mule-os.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd">
<http:listener-config name="HTTP_Listener_config" >
<http:listener-connection host="0.0.0.0" port="8081" />
</http:listener-config>
<db:config name="Database_Config" >
<db:derby-connection />
</db:config>
<flow name="httplistenerresponseFlow" >
<http:listener config-ref="HTTP_Listener_config" path="/account/{accountId}/logo">
<http:response statusCode="201" reasonPhrase="Created">
<http:body ><![CDATA[output text/plain --- vars.logoName ++ ' has been stored as a ' ++ vars.accountId ++ ' logo.']]></http:body>
</http:response>
<http:error-response statusCode="#[vars.errorCode default 500]" >
<http:body ><![CDATA[vars.logoName ++ ' could not be stored.']]></http:body>
<http:headers ><![CDATA[#[output application/java
---
{
"X-Time" : "50s" // 4
}]]]></http:headers>
</http:error-response>
</http:listener>
<set-variable value="payload.parts.name.content" variableName="logoName"/>
<set-variable value="attributes.uriParams.accountId" variableName="accountId"/>
<db:insert doc:name="Insert" config-ref="Database_Config">
<db:sql><![CDATA[INSERT INTO logo (accountId,logoName) VALUES (:accountId, :logoName)]]></db:sql>
<db:input-parameters ><![CDATA[#[{'accountId': vars.accountId as String, 'logoName': vars.logoName as String}]]]></db:input-parameters>
</db:insert>
<error-handler >
<on-error-propagate enableNotifications="true" logException="true" doc:name="On Error Propagate" type="DB:CONNECTIVITY">
<set-variable value="504" variableName="errorCode"/>
</on-error-propagate>
</error-handler>
</flow>
</mule>