Flex Gateway新着情報
Governance新着情報
Monitoring API ManagerMIME タイプ: multipart/form-data
ID: multipart
DataWeave ではマルチパートサブタイプ (特に form-data
) がサポートされます。この形式では、各パートの形式に関係なく、1 つのペイロード内で複数の異なるデータパートを処理できます。パートの開始と終了を区別するには、境界を使用します。各パートのメタデータはヘッダーを介して追加できます。
DataWeave では、特定の Object
構造を使用して、マルチパートドキュメントを表します。
type Multipart = { preamble?: String, parts: { _?: MultipartPart } } type MultipartPart = { headers?: { "Content-Disposition"?: { name: String, filename?: String }, "Content-Type"?: String }, content: Any }
weave
次の例は、マルチパート形式の使用方法を示しています。
次の例は、DataWeave で単純なマルチパートコンテンツを読み取る方法を示しています。
マルチパート入力は、DataWeave ソースへのペイロードとして機能します。
--34b21 Content-Disposition: form-data; name="text" Content-Type: text/plain Book --34b21 Content-Disposition: form-data; name="file1"; filename="a.json" Content-Type: application/json { "title": "Java 8 in Action", "author": "Mario Fusco", "year": 2014 } --34b21 Content-Disposition: form-data; name="file2"; filename="a.html" Content-Type: text/html <title> Available for download! </title> --34b21--
text
この DataWeave スクリプトは、マルチパート入力ペイロードを DataWeave (dw) 形式に変換します。
%dw 2.0 output application/dw --- payload
weave
この出力は、DataWeave (dw) 形式でマルチパート入力がどのように表されるのかを示しています。raw
および content
値は、簡潔にするために短縮されています。完全な値はこれよりも長くなります。
{ parts: { text: { headers: { "Content-Disposition": { name: "text", subtype: "form-data" }, "Content-Type": "text/plain" }, content: "Book" as String { raw: "Qm9vaw==" as Binary { base: "64" }, encoding: null, mediaType: "text/plain", mimeType: "text/plain" } }, file1: { headers: { "Content-Disposition": { name: "file1", filename: "a.json", subtype: "form-data" }, "Content-Type": "application/json" }, content: { title: "Java 8 in Action", author: "Mario Fusco", year: 2014 } as Object { raw: "ewogICJ0aXRsZSI6ICJKYXZhI...==" as Binary { base: "64" }, encoding: null, mediaType: "application/json", mimeType: "application/json" } }, file2: { headers: { "Content-Disposition": { name: "file2", filename: "a.html", subtype: "form-data" }, "Content-Type": "text/html" }, content: "PCFET0NUWVBFIGh0bWw+Cjx0aXRsZT4KI...==" as Binary { base: "64" } } } }
weave
DataWeave スクリプト内で、parts
要素を選択し、任意のパートのデータにアクセスし、変換できます。操作は配列に基づくことができます。また、パートを参照するための名前がパートに設定されている場合は、キーに基づくことができます。パートのデータには content
キーワードを介してアクセスでき、ヘッダーには headers
キーワードを介してアクセスできます。
次の例は、個別の DataWeave スクリプトへの入力として機能します。3 つのパートで構成される 34b21
境界を含む未加工の multipart/form-data
ペイロードを以下に示します。
text
という名前の text/plain
file1
という名前の application/json
ファイル (a.json
)
file2
という名前の text/html
ファイル (a.html
)
--34b21 Content-Disposition: form-data; name="text" Content-Type: text/plain Book --34b21 Content-Disposition: form-data; name="file1"; filename="a.json" Content-Type: application/json { "title": "Java 8 in Action", "author": "Mario Fusco", "year": 2014 } --34b21 Content-Disposition: form-data; name="file2"; filename="a.html" Content-Type: text/html <!DOCTYPE html> <title> Available for download! </title> --34b21--
text
次の DataWeave スクリプトは、入力として未加工の multipart/form-data
ペイロードを使用し、Book:a.json
を生成します。
%dw 2.0
output text/plain
---
payload.parts.text.content ++ ':' ++ payload.parts[1].headers.'Content-Disposition'.filename
dataweave
DataWeave がパートのリスト (各パートにヘッダーとコンテンツが含まれる) を含むオブジェクトを構築するマルチパートコンテンツを生成できます。次の DataWeave スクリプトでは、ペイロード内で HTML データを使用できる場合に、(以前に分析した) 未加工のマルチパートデータを生成します。
DataWeave ドキュメントの出力の一貫性を確保するために、この例では boundary プロパティをハードコード化します。
ただし、多くの場合、DataWeave によってランダムな境界が生成されて出力 MIME タイプに追加されるため、このプロパティをハードコード化する必要はありません。
|
%dw 2.0
output multipart/form-data boundary='34b21'
---
{
parts : {
text : {
headers : {
"Content-Type": "text/plain"
},
content : "Book"
},
file1 : {
headers : {
"Content-Disposition" : {
"name": "file1",
"filename": "a.json"
},
"Content-Type" : "application/json"
},
content : {
title: "Java 8 in Action",
author: "Mario Fusco",
year: 2014
}
},
file2 : {
headers : {
"Content-Disposition" : {
"filename": "a.html"
},
"Content-Type" : payload.^mimeType
},
content : payload
}
}
}
dataweave
パートの名前が Content-Disposition
ヘッダーに明示的に提供されていない場合は、キーによりパートの名前が決まります。また、DataWeave は、サポートされる形式からのコンテンツを処理できるだけでなく、HTML など、サポートされない形式への参照からコンテンツを処理できます。
次の例は、現在のペイロードをマルチパートフォームデータのファイルパートとして送信する方法を示しています。次のような DataWeave スクリプトを使用する必要があります。
%dw 2.0
input payload application/xml
output multipart/form-data boundary="----myboundary----"
---
{
parts: {
filePart: {
headers: {
"Content-Disposition": {
"name": "<NAME>",
"filename": "<FILE_NAME>.<FILE_EXTENSION>"
},
"Content-Type": "<FILE_CONTENT-TYPE>"
},
content: payload
},
otherJsonPart: {
content: '{"name": "sampleFile.xml", "sampleFile": {"type": "sample"} }'
}
}
}
dataweave
boundary
は境界値を設定します (例: "----myboundary----"
)。
<NAME>
はファイルのタグ名です (例: "sampleFile"
)。
<FILE_NAME>.<FILE_EXTENSION>
はペイロードのコンテンツを入力するためのファイル名です (例: "sampleFile.xml"
)。
<FILE_CONTENT-TYPE>
は送信するファイルのコンテンツと一致させます (例: "application/xml"
)。
ファイルのコンテンツは現在のペイロードです。
この例には、マルチパートに 2 つのパート (ファイルと otherJsonPart
) が含まれています。さらにパートを追加する場合は、parts:{}
セクションの下に次の形式で追加します。
<PART_NAME>: {
content: <PART_CONTENT>
}
dataweave
<PART_NAME>
は引用符なしのパート名です (例: json
)。
<PART_CONTENT>
はそのパートのコンテンツです (例: '{"name": "sampleFile.xml", "sampleFile": {"type": "sample"} }'
)。
次の XML 入力を前提とします。
<Customers>
<Customer>
<Number>1</Number>
<FirstName>Fred</FirstName>
<LastName>Landis</LastName>
<Address>
<Street>Oakstreet</Street>
<City>Boston</City>
<ZIP>23320</ZIP>
<State>MA</State>
</Address>
</Customer>
<Customer>
<Number>2</Number>
<FirstName>Michelle</FirstName>
<LastName>Butler</LastName>
<Address>
<Street>First Avenue</Street>
<City>San-Francisco</City>
<ZIP>44324</ZIP>
<State>CA</State>
</Address>
</Customer>
<Customer>
<Number>3</Number>
<FirstName>Ted</FirstName>
<LastName>Little</LastName>
<Address>
<Street>Long Way</Street>
<City>Los-Angeles</City>
<ZIP>34424</ZIP>
<State>CA</State>
</Address>
</Customer>
</Customers>
xml
DataWeave スクリプトは次のようになります。
%dw 2.0
output multipart/form-data boundary="----myboundary----"
---
{
parts: {
filePart: {
headers: {
"Content-Disposition": {
"name": "test",
"filename": "sampleFile.xml"
},
"Content-Type": "application/xml"
},
content: payload
},
otherJsonPart: {
content: '{"name": "sampleFile.xml", "sampleFile": {"type": "sample"} }'
}
}
}
dataweave
出力マルチパートは次のようになります。
------myboundary---- Content-Type: application/xml Content-Disposition: form-data; name="test"; filename="sampleFile.xml" <Customers> <Customer> <Number>1</Number> <FirstName>Fred</FirstName> <LastName>Landis</LastName> <Address> <Street>Oakstreet</Street> <City>Boston</City> <ZIP>23320</ZIP> <State>MA</State> </Address> </Customer> <Customer> <Number>2</Number> <FirstName>Michelle</FirstName> <LastName>Butler</LastName> <Address> <Street>First Avenue</Street> <City>San-Francisco</City> <ZIP>44324</ZIP> <State>CA</State> </Address> </Customer> <Customer> <Number>3</Number> <FirstName>Ted</FirstName> <LastName>Little</LastName> <Address> <Street>Long Way</Street> <City>Los-Angeles</City> <ZIP>34424</ZIP> <State>CA</State> </Address> </Customer> </Customers> ------myboundary---- Content-Disposition: form-data; name="otherJsonPart" {"name": "sampleFile.xml", "sampleFile": {"type": "sample"} } ------myboundary------
multipart
次の例は、DataWeave がペイロードのすべてのパートを反復処理して各パートを個別に処理する方法を示しています。
%dw 2.0
output application/json
var multi = '--34b21
Content-Disposition: form-data; name="text"
Content-Type: text/plain
Book
--34b21
Content-Disposition: form-data; name="file1"; filename="a.json"
Content-Type: application/json
{
"title":"Java 8 in Action",
"author":"Mario Fusco",
"year":2014
}
--34b21
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html
<!DOCTYPE html>
<title>
Available for download!
</title>
--34b21--'
var parsed = read(multi, "multipart/form-data", {boundary:'34b21'})
---
parsed.parts mapObject ((value, key, index) -> {(index): key})
dataweave
{
"0": "text",
"1": "file1",
"2": "file2"
}
json
^mimeType
セレクターは、パラメーターなしの値の MIME タイプ (application/json
など) を返します。^mediaType
セレクターは、対照的に MIME タイプとそれに関連する他のパラメーター (application/json;charset=UTF-16
など) を返します。
次の例では、マルチパート入力を異なる形式のマルチパート出力に変換する方法を示しています。この DataWeave スクリプトでは、^mimeType
セレクターと ^mediaType
セレクターの両方を使用して新しいマルチパートコンテンツを生成します。
マルチパート入力には複数のコンテンツタイプがあります。この場合は、非標準の区切り文字が含まれる application/json
と application/csv
です。
----------------------------049709565842371278701691 Content-Type: application/json Content-Disposition: form-data; name="order" { "name": "order1", "id": 123, "content": "orderContent" } ----------------------------049709565842371278701691 Content-Type: application/csv;separator=. Content-Disposition: form-data; name="partner" partnerName.id mulesoft.1 ----------------------------049709565842371278701691--
text
この DataWeave スクリプトでは、output multipart/form-data
MIME タイプを定義してマルチパート入力をマルチパート出力に変換します。マルチパート出力データには 2 つのパートが含まれます。
orderAck
注文の受信の肯定応答を伴うテキストが含まれます。コンテンツタイプは text/plain
です。 ^mimeType` セレクターは、メッセージのパートとしてコンテンツタイプを記録する場合に役に立ちます。
partner
元のパートナー自体が含まれます。今回はコンテンツタイプが payload.parts..^mediaType
である点に注意してください。^mediaType セレクターには、application/csv
コンテンツを解析する区切り文字も含まれます。
%dw 2.0
input payload multipart boundary='boundary1'
output multipart boundary='test2'
---
{
parts : {
orderAck : {
headers : {
"Content-Type": "text/plain"
},
content : "Order payload of type " ++ payload.parts.order.content.^mimeType ++ " and id " ++ (payload.parts.order.content.id as String) ++ " received. Receipt available."
},
partner: {
headers : {
"Content-Type": payload.parts.partner.content.^mediaType
},
content : payload.parts.partner.content
}
}
}
dataweave
--test2 Content-Type: text/plain Content-Disposition: form-data; name="orderAck" Order payload of type application/json and id 123 received. Receipt available. --test2 Content-Type: application/csv;separator=. Content-Disposition: form-data; name="partner" partnerName.id mulesoft.1 --test2--
text
DataWeave では、この形式の以下の設定プロパティがサポートされています。
この形式は、入力データを読み取るための指示を提供するプロパティを受け入れます。
パラメーター | 型 | デフォルト | 説明 |
---|---|---|---|
|
|
|
マルチパートの |
|
|
|
2021 年 8 月リリースの Mule 4.3.0-20210719 の DataWeave 2.3 (2.3.0-20210720) で導入されました。 |
この形式は、出力データを書き込むための指示を提供するプロパティを受け入れます。
パラメーター | 型 | デフォルト | 説明 |
---|---|---|---|
|
|
|
マルチパートの |
|
|
|
バッファライターのサイズ (バイト)。値は 8 よりも大きい必要があります。 |
|
|
|
有効な値は、 |
この形式では、次の MIME タイプがサポートされます。
MIME タイプ |
---|
|