使用DataWeave生成multipart/mixed负载时移除边界--XX问题
解决Anypoint Request组件中multipart/mixed负载多余边界问题
问题背景
在Anypoint平台的Request组件中,通过DataWeave将输入JSON转换为指定格式的multipart/mixed负载时,输出结果中存在多余的边界标识--XX,需要移除该冗余内容。
输入数据
{"salesOrderNumber": "129467145", "items": [{"salesOrderItemNumber": "20", "firstPlannedShipDate": "2024-05-27T00:00:00.000Z", "firstPlannedDeliveryDate": "2024-06-25T00:00:00.000Z"}, {"salesOrderItemNumber": "40", "firstPlannedShipDate": "2024-05-27T00:00:00.000Z", "firstPlannedDeliveryDate": "2024-06-25T00:00:00.000Z"}]}
原有DataWeave代码
%dw 2.0 import * from dw::util::Coercions output multipart/mixed boundary="batch" var innerJsonPart ={"ZZ1_FCDD_SDI": "\/Date(1719273600)\/", "ZZ1_FCSD_SDI": "\/Date(1716768000)\/"} --- parts:payload.items map(item, index)->( { headers: { "Content-Type": "multipart/mixed; boundary=changeset_mychangeset" ++ (index+1) , }, content: { parts: {part0: { headers: { "Content-Type": "application/http", "Content-Transfer-Encoding": "binary" }, content: write( { parts: [ { content: "PATCH A_SalesOrderItem(SalesOrder='0" ++ (payload.salesOrderNumber) ++"',SalesOrderItem='" ++ (item.salesOrderItemNumber) ++"') HTTP/1.1" }, { headers: { "Content-Type": "application/json" }, content: innerJsonPart } ] }, "multipart/mixed",{boundary: "XX"}), }, }}})
当前问题输出
--batch Content-Type: multipart/mixed; boundary=changeset_mychangeset1 --changeset_mychangeset1 Content-Type: application/http Content-Transfer-Encoding: binary PATCH A_SalesOrderItem(SalesOrder='0129467145',SalesOrderItem='20') HTTP/1.1 Content-Type: application/json { "ZZ1_FCDD_SDI" : "\/Date(1719273600)\/", "ZZ1_FCSD_SDI" : "\/Date(1716768000)\/" } --changeset_mychangeset1-- --batch Content-Type: multipart/mixed; boundary=changeset_mychangeset2 --changeset_mychangeset2 Content-Type: application/http Content-Transfer-Encoding: binary PATCH A_SalesOrderItem(SalesOrder='0129467145',SalesOrderItem='40') HTTP/1.1 Content-Type: application/json { "ZZ1_FCDD_SDI" : "\/Date(1719273600)\/", "ZZ1_FCSD_SDI" : "\/Date(1716768000)\/" } --changeset_mychangeset2-- --batch--
问题分析
原有代码中手动调用write(..., "multipart/mixed", {boundary: "XX"})生成内层multipart内容,导致额外插入了XX相关的冗余边界。实际上无需手动处理内层multipart的序列化,直接通过DataWeave的multipart结构定义,平台会自动处理边界生成逻辑。
修正后的DataWeave代码
%dw 2.0 output multipart/mixed boundary="batch" var innerJsonPart = {"ZZ1_FCDD_SDI": "\/Date(1719273600)\/", "ZZ1_FCSD_SDI": "\/Date(1716768000)\/"} --- parts: payload.items map(item, index) -> { headers: { "Content-Type": "multipart/mixed; boundary=changeset_mychangeset" ++ (index+1) }, content: { parts: [ { headers: { "Content-Type": "application/http", "Content-Transfer-Encoding": "binary" }, content: "PATCH A_SalesOrderItem(SalesOrder='0" ++ payload.salesOrderNumber ++ "',SalesOrderItem='" ++ item.salesOrderItemNumber ++ "') HTTP/1.1" }, { headers: { "Content-Type": "application/json" }, content: innerJsonPart } ] } }
修正效果
输出不再包含多余的--XX边界,内层multipart会自动使用指定的changeset_mychangesetN边界,结构完全符合业务要求。
内容的提问来源于stack exchange,提问作者user15057578
相关产品推荐
相关产品推荐

