簡體   English   中英

在wso2 esb中使用聚合介體聚合多個json響應

[英]Aggregate multiple json responses with aggregate mediator in wso2 esb

我在wso2 esb中定義了一個api,它通過接收列表調用了兩個內部API,並且傳遞了json響應,如下所示。(示例響應)

{
  "name": "api1",
  "response": "success",
  "status": "1"
}

{
  "name": "api2",
  "response": "unsuccess",
  "status": "2"
}

我需要通過將這兩個響應聚合為單個響應來傳遞響應。 我關於payloadfactory並且能夠構建聚合響應。 但是我需要聚合來自這兩個api的響應,並將響應作為一個單獨的json對象生成並通過包括這兩個響應,如下所示

 {
    "response1": {
        "name": "api1",
        "response": "success",
        "status": "1"
    },
    "response2": {
        "name": "api2",
        "response": "unsuccess",
        "status": "2"
    }
}

那么如何用WSO2ESB來完成。 我正在使用最新版本的ESB。

我創建了三個API並使用Clone聚合API響應,下面是我的API,用於聚合兩個API端點的響應

<api xmlns="http://ws.apache.org/ns/synapse" name="aggregateResponse" context="/aggregate">
   <resource methods="POST">
      <inSequence>
         <clone id="aggr">
            <target>
               <sequence>
                  <call>
                     <endpoint>
                        <http method="GET" uri-template="http://localhost:8280/getresponse1"/>
                     </endpoint>
                  </call>
                  <log>
                     <property name="Logger1" expression="json-eval($.)"/>
                  </log>
               </sequence>
            </target>
            <target>
               <sequence>
                  <call>
                     <endpoint>
                        <http method="GET" uri-template="http://localhost:8280/getResponse2"/>
                     </endpoint>
                  </call>
                  <log>
                     <property name="Logger1" expression="json-eval($.)"/>
                  </log>
               </sequence>
            </target>
         </clone>
         <payloadFactory media-type="json">
            <format>{"responses":{ "name":"$1","response":"$2","status":"$3"}}</format>
            <args>
               <arg evaluator="json" expression="$.name"/>
               <arg evaluator="json" expression="$.response"/>
               <arg evaluator="json" expression="$.status"/>
            </args>
         </payloadFactory>
         <loopback/>
      </inSequence>
      <outSequence>
         <property name="res" scope="default">
            <ResponseDetail xmlns=""/>
         </property>
         <aggregate id="aggr">
            <completeCondition>
               <messageCount min="-1" max="-1"/>
            </completeCondition>
            <onComplete expression="$body//responses" enclosingElementProperty="res">
               <payloadFactory media-type="json">
                  <format>{"response1":$1 ,"response2":$2}</format>
                  <args>
                     <arg evaluator="json" expression="$.ResponseDetail.responses[0]"/>
                     <arg evaluator="json" expression="$.ResponseDetail.responses[1]"/>
                  </args>
               </payloadFactory>
               <send/>
            </onComplete>
         </aggregate>
      </outSequence>
   </resource>
</api>

API 1:

<api xmlns="http://ws.apache.org/ns/synapse" name="response1" context="/getresponse1">
   <resource methods="GET">
      <inSequence>
         <payloadFactory media-type="json">
            <format>{  "name": "api1",  "response": "success",  "status": "1"}</format>
            <args/>
         </payloadFactory>
         <respond/>
      </inSequence>
   </resource>
</api>

API 2:

<api xmlns="http://ws.apache.org/ns/synapse" name="response2" context="/getResponse2">
   <resource methods="GET">
      <inSequence>
         <payloadFactory media-type="json">
            <format>{  "name": "api2",  "response": "unsuccess",  "status": "2"}</format>
            <args/>
         </payloadFactory>
         <respond/>
      </inSequence>
   </resource>
</api>

那么,這就是豐富的調解員變得方便的地方。 請試一試。 我沒有測試過這個,因為我現在沒有做WSO2相關的事情。 但我們熱烈歡迎您的反饋。 偽代碼是這樣的。

<call>
    <endpoint>
       <http method="GET" uri-template="http://www.mocky.io/v2/some-ep"/>
    </endpoint>
 </call>
 <enrich>
    <source type="body" clone="true"/>
    <target type="property" property="first-json"/>
 </enrich>
    <call>
    <endpoint>
       <http method="GET" uri-template="http://www.mocky.io/v2/another-ep"/>
    </endpoint>
 </call>
 <enrich>
    <source type="property" property="first-json" clone="true"/>
    <target action="sibling" xpath="//"/>
 </enrich>
 </respond>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM