2016-05-13 88 views
0

有两个http调用(调用rest api),它会给出两个不同的响应。 第一个被给予像下面需要帮助将两个Json结果合并为单个响应使用Mule

{ 
"shops": [ 
    { 
     "shop": { 
      "code": "a", 
      "streetName": "a", 
      "city": "a", 
      "district": "a", 
      "state": "a", 
      "postalCode": "a", 
      "country": "a" 

     } 
    }, 
    { 
     "shop": { 
      "code": "b", 
      "streetName": "b", 
      "city": "b", 
      "district": "b", 
      "state": "b", 
      "postalCode": "b", 
      "country": "b" 
     } 
    } 
] 

用于商店JSON响应}

其他呼叫是给销售处对于给定的代码(代码是相同店)。它返回单个销售处对于给定的代码

{ 
"salesOffice": { 
    "shop": { 
     "code": "a" 
    }, 
    "office": "a", 
    "branch": "a", 
    "district": "a", 
    "subRegion": "a", 
    "region": "a" 
} 

}

我的要求是让店铺这是一个JSON数组,并添加销售办事处为每个店铺并返回一个JSO像下面

{ 
"shops": [ 
    { 
     "shop": { 
      "code": "a", 
      "streetName": "a", 
      "city": "a", 
      "district": "a", 
      "state": "a", 
      "postalCode": "a", 
      "country": "a", 
      "salesOffice": { 
       "office": "a", 
       "branch": "a", 
       "district": "a", 
       "subRegion": "a", 
       "region": "a" 
      } 
     } 
    }, 
    { 
     "shop": { 
      "code": "b", 
      "streetName": "b", 
      "city": "b", 
      "district": "b", 
      "state": "b", 
      "postalCode": "b", 
      "country": "b", 
      "salesOffice": { 
       "office": "b", 
       "branch": "b", 
       "district": "b", 
       "subRegion": "", 
       "region": "b" 
      } 
     } 
    } 
] 

}

有任何方法来实现,结果第n响应??

编辑 我需要得到售楼处都店(会有每个店铺代码HTTP请求),并将其合并到的响应。所以如果我得到两个商店,那么我需要发送两个http请求来获得这些代码的salesoffice,然后将其与响应合并。

所以第一个电话给我店(可以说两家店铺)。然后,我需要通过获得“码”存在于每个店获得销售办事处,以使两个HTTP调用..然后我需要在两个商店与各自的销售办事处合并...

+0

你在哪里得到salesOffice的 “B” 的记录吗? –

+0

@ArdenVallente我被制作HTTP调用并通过“代码”得到一个单一salesOffice ......所以要得到salesoffice“B”我需要拨打另一个电话 – Anand

回答

2

你可以做这样的事情。

enter image description here

XML文件:

<flow name="merge-jsonFlow1"> 
     <http:listener config-ref="HTTP_Listener_Configuration" path="/json-merge" doc:name="HTTP"/> 
     <expression-component doc:name="Mock HTTP Response"><![CDATA[payload = '{"shops":[{"shop":{"code":"a","streetName":"a","city":"a","district":"a","state":"a","postalCode":"a","country":"a"}},{"shop":{"code":"b","streetName":"b","city":"b","district":"b","state":"b","postalCode":"b","country":"b"}}]}']]></expression-component> 
     <set-variable variableName="shops" value="#[payload]" doc:name="Store Orig Payload to Variable"/> 
     <processor-chain doc:name="Processor Chain"> 
      <splitter expression="#[json:/shops]" doc:name="Splitter"/> 
      <set-variable variableName="storeCode" value="#[json:/shop/code]" doc:name="Set Store Code"/> 
      <expression-component doc:name="Mock HTTP Call to Get SalesOffice"><![CDATA[if (flowVars['storeCode'] == 'a') { 
    payload = '{"salesOffice":{"shop":{"code":"a"},"office":"a","branch":"a","district":"a","subRegion":"a","region":"a"}}'; 
} else if (flowVars['storeCode'] == 'b') { 
    payload = '{"salesOffice":{"shop":{"code":"b"},"office":"b","branch":"b","district":"b","subRegion":"b","region":"b"}}'; 
}]]></expression-component> 
      <collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/> 
     </processor-chain> 
     <set-payload value="#[[flowVars['shops'], payload]]" doc:name="Merge Two JSON"/> 
     <json:json-to-object-transformer doc:name="JSON to Object"/> 
     <dw:transform-message metadata:id="c72e3e02-8350-42ec-a3cb-ca61c7b722b4" doc:name="Transform Message"> 
      <dw:input-payload doc:sample="json-merge.json"/> 
      <dw:set-payload><![CDATA[%dw 1.0 
%output application/json 
--- 
using (
    shops = payload[0].shops, 
    so = payload[1].*salesOffice 
) 
{ 
    shops : shops.shop map { 
     shop: using (mycode = $.code) { 
       code: $.code, 
       streetName: $.streetName, 
       city: $.city, 
       district: $.district, 
       state: $.state, 
       postalCode: $.postalCode, 
       country: $.country, 
       salesOffice: ((so map { 
        shopCode: $.shop.code, 
        office: $.office, 
        branch: $.branch, 
        district: $.district, 
        subRegion: $.subRegion, 
        region: $.region 
       }) filter $.shopCode == mycode)[0] 
     } 
    } 
}]]></dw:set-payload> 
     </dw:transform-message> 
    </flow> 
+0

谢谢..我得到了我所有必填字段的最终Json。卡在最后变压器..非常感谢您的帮助 – Anand

0

你可以做这样的事情。我使用dataweave来转换json。

enter image description here

模拟API响应是HTTP调用您的API。

XML文件:

<flow name="merge-jsonFlow"> 
     <http:listener config-ref="HTTP_Listener_Configuration" path="/merge" doc:name="HTTP"/> 
     <scatter-gather doc:name="Scatter-Gather"> 
      <expression-component doc:name="Mock API1 Response"><![CDATA[payload = '{"shops":[{"shop":{"code":"a","streetName":"a","city":"a","district":"a","state":"a","postalCode":"a","country":"a"}},{"shop":{"code":"b","streetName":"b","city":"b","district":"b","state":"b","postalCode":"b","country":"b"}}]}']]></expression-component> 
      <expression-component doc:name="Mock API2 Response"><![CDATA[payload = '{"salesOffice":{"shop":{"code":"a"},"office":"a","branch":"a","district":"a","subRegion":"a","region":"a"}}']]></expression-component> 
     </scatter-gather> 
     <json:json-to-object-transformer doc:name="JSON to Object"/> 
     <dw:transform-message metadata:id="0066a92a-85d8-4514-8459-b70252cb2f7b" doc:name="Transform Message"> 
      <dw:set-payload><![CDATA[%dw 1.0 
%output application/json 
--- 
using (
    shops = payload[0].shops, 
    salesOffice = payload[1].salesOffice 
) 
{ 
    shops : shops.shop map { 
     shop: { 
       code: $.code, 
       streetName: $.streetName, 
       city: $.city, 
       district: $.district, 
       state: $.state, 
       postalCode: $.postalCode, 
       country: $.country, 
       (salesOffice: { 
        office: salesOffice.office, 
        branch: salesOffice.branch, 
        district: salesOffice.district, 
        subRegion: salesOffice.subRegion, 
        region: salesOffice.region 
       }) when $.code == salesOffice.shop.code 
     } 
    } 
}]]></dw:set-payload> 
     </dw:transform-message> 
     <logger message="#[payload]" level="INFO" doc:name="Logger"/> 
    </flow> 

样品响应:

{ 
    "shops": [ 
    { 
     "shop": { 
     "code": "a", 
     "streetName": "a", 
     "city": "a", 
     "district": "a", 
     "state": "a", 
     "postalCode": "a", 
     "country": "a", 
     "salesOffice": { 
      "office": "a", 
      "branch": "a", 
      "district": "a", 
      "subRegion": "a", 
      "region": "a" 
     } 
     } 
    }, 
    { 
     "shop": { 
     "code": "b", 
     "streetName": "b", 
     "city": "b", 
     "district": "b", 
     "state": "b", 
     "postalCode": "b", 
     "country": "b" 
     } 
    } 
    ] 
} 

希望这有助于

+0

我需要得到售楼处都店(会有一个每个商店代码的http请求)并将其合并到响应中。所以如果我得到两个商店,那么我需要发送两个http请求来获得这些代码的salesoffice,然后将其与响应合并。 – Anand

+0

所以第一个电话会给我店(让我们说两个店)。那么我需要通过获得“代码”出现在每个商店获得销售办公室两个http调用..然后我需要合并两个商店与各自的销售办事处.... – Anand