2016-08-24 34 views
1

我創建在WSO2碳(5.0)的API,其餘POST的有效載荷聚合至不同JSON數據:WSO2 - 轉化和從多個端點

{ "IdNumber" : "8008185218088", "LastName" : null }

然後調用發起克隆介體序列將該有效負載轉發給兩個不同的REST端點。從端點JSON響應是不同的:

端點1響應:

{ "Name" : "Daniel", "Number" : "12345678" }

端點2響應:

{ "Name": "Bob", "Address": "200 Bob Street", "Code": "123" }

的API響應我想基於創建以上:

{ 
    "Endpoint 1 Response" : { 
     "Name" : "Daniel", 
     "Number" : "12345678" 
    }, 

    "Endpoint 2 Response" : { 
     "Name": "Bob", 
     "Address": "200 Bob Street", 
     "Code": "123" 
    } 
} 

outSequence需要配置什麼介質才能實現此目的?我將如何查詢單個json響應字段並將它們合併到客戶端的自定義格式化json消息中?

我已經看過了Aggregate mediator,但我不認爲它適用於格式不同的消息。

這裏是我的參考inSequence中:

<resource methods="POST"> 
     <inSequence> 
     <property name="ROOT" scope="default"> 
      <root:rootelement xmlns:root="www.wso2esb.com"/> 
     </property> 
     <log level="full"/> 
     <clone continueParent="true" id="test" sequential="true"> 
      <target> 
       <sequence> 
        <send> 
        <endpoint> 
         <address uri="http://192.168.1.1/api/service/person" format="rest"/> 
        </endpoint> 
        </send> 
       </sequence> 
      </target> 
      <target> 
       <sequence> 
        <send> 
        <endpoint> 
         <address uri="http://192.168.1.1/api2/query" format="rest"/> 
        </endpoint> 
        </send> 
       </sequence> 
      </target> 
     </clone> 
     </inSequence> 

回答

2

您將無法像這樣聚集的消息。解決方案是使用'call'中介,將第一個響應(或值)存儲在屬性中,然後調用第二個服務。

事情是這樣的:

<call> 
    <endpoint> 
     <address uri="http://192.168.1.1/api/service/person" format="rest"/> 
    </endpoint> 
</call> 
<property name="Name1" expression="//Name" /> 
<property name="Number1" expression="//Number" /> 
<send> 
    <endpoint> 
     <address uri="http://192.168.1.1/api2/query" format="rest"/> 
    </endpoint> 
</send> 
<outSequence> 
-- build message using payloadfactory 
</outSequence> 

您可以使用payloadFactory在outSequence建立響應消息。

+0

看起來像一個很好的解決方案,只是幾個問題。爲什麼在第一個調解員中使用呼叫,然後在第二個調解員中發送?另外,如果第二個端點響應中的字段名稱相同,例如我的「Name」json字段,如何區分第一個調用中字段的屬性? –

+0

嗨丹尼爾,通常一個代理服務器通過序列使用'發送'和響應通過使用發送outsequence傳遞請求。在這種情況下,你想要做2個請求,所以額外的一個是使用'call'完成的。要回答第二個問題:中介始終在「消息上下文」上運行,這意味着當前正在處理的消息。因此,在通話之後,您將根據第一個api通話的響應進行操作,並且在發送後(通過後面的操作),您將操作第二個api通話的響應。 – Jan

+0

感謝Jan.我遇到了使用您的解決方案的問題,outSequence似乎在收到來自第二個端點的響應之前正在執行。另外,我不確定如何處理兩個屬性使用相同表達式(因爲兩個響應具有相同字段名稱)但具有不同值的情況。如何確保在執行outSequence之前收到兩個響應,以及如何爲2個不同的響應定義具有相同表達式的2個屬性? –