スクリプトの MIME タイプ出力の変更

この DataWeave の例では、出力 MIME タイプと、出力データを書式設定する MIME タイプを区別する方法を示します。このような区別により、Mule アプリケーションは、クライアントがアプリケーションの出力データの表示方法の決定に使用できる MIME タイプを出力できます。たとえば、HTTP は MIME タイプを使用してその ​Content-Type​ ヘッダーを生成します。

開始する前に、Mule 4 アプリケーションでは DataWeave のバージョン 2.x が使用されることに注意してください。Mule 3 アプリケーションでの DataWeave については、​DataWeave バージョン 1.2 の例​を参照してください。 他の DataWeave バージョンの場合は、DataWeave の目次のバージョンセレクターを使用できます。

最初の例では、API の「問題の詳細」標準を使用します。この標準では、レスポンスヘッダーに ​application/problem+json​ コンテンツタイプが必要になり、特定のキーが含まれる JSON 形式のレスポンスボディも必要になります。

この例として、HTTP 要求を処理するが常に失敗する Mule フローが挙げられます。失敗により、エラーハンドラーがトリガーされます。エラーハンドラーは、状況コードを 400 に設定し、DataWeave スクリプトを使用してこの標準に準拠する応答を生成します。

DataWeave 出力ディレクティブ ​output application/problem+json with json​ は、​application/problem+json​ MIME タイプと JSON 形式の本文が含まれる応答を生成するようにスクリプトに指示します。

400 エラーを受信したクライアントは、応答で ​Content-Type: application/problem+json​ を使用して、標準的な方法 (想定される ​title​ キーの使用など) で応答データを処理できるかどうかを判断します。一方、​problem+​ のない MIME タイプ ​Content-Type: application/json​ は、そのような方法でクライアントがエラーを処理できるかどうかを示すことができません。

Mule フロー:
<flow name="problemDetailFlow">
		<http:listener config-ref="HTTP_Listener_config" path="/test">
			<http:error-response statusCode="#[vars.statusCode]" >
				<http:body ><![CDATA[#[payload]]]></http:body>
			</http:error-response>
		</http:listener>
		<raise-error doc:name="Raise error" type="CUSTOM:FORCED" description="This is a manual error to force the execution of the error handler."/>
		<error-handler >
			<on-error-propagate>
				<set-variable value="#[400]" variableName="statusCode"/>
				<ee:transform>
					<ee:message>
						<ee:set-payload><![CDATA[%dw 2.0
output application/problem+json with json
---
{
  "type": "https://example.org/out-of-stock",
  title: "Out of Stock",
  status: vars.statusCode,
  detail: "Item B00027Y5QG is no longer available",
  product: "B00027Y5QG"
}]]></ee:set-payload>
					</ee:message>
				</ee:transform>
			</on-error-propagate>
		</error-handler>
	</flow>
応答:
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json; charset=UTF-8
Content-Length: 173
Date: Thu, 02 Apr 2020 19:48:23 GMT
Connection: close

[data-source-url=modules/ROOT/pages/_partials/cookbook-dw/change-script-output-mime-ex1-partial-solution]
{
  "type": "https://example.org/out-of-stock",
  "title": "Out of Stock",
  "status": 400,
  "detail": "Item B00027Y5QG is no longer available",
  "product": "B00027Y5QG"
}

次の例では、Mule フローは DataWeave によって生成された ​text/markdown​ コンテンツを単純なテキストとして返します。マークダウンがサポートされているブラウザーでは、アスタリスクを使用してプレーンテキストで入力を表示する代わりに、マークダウンのルールに従って箇条書きのコンテンツとして表示できます。

Mule フロー:
<flow name="listFlow">
  <http:listener config-ref="HTTP_Listener_config" path="/some.md"/>
  <ee:transform>
    <ee:message>
      <ee:set-payload ><![CDATA[%dw 2.0
output text/markdown with text
---
"* idea 1
* some other idea"]]></ee:set-payload>
    </ee:message>
  </ee:transform>
</flow>
応答:
HTTP/1.1 200
Content-Type: text/markdown; charset=UTF-8
Content-Length: 26
Date: Thu, 02 Apr 2020 21:28:36 GMT

* idea 1
* some other idea