2016-05-13 86 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