2017-03-02 74 views
0

我有以下形式的APIWSO2 ESB調用不及格信封

<api xmlns="http://ws.apache.org/ns/synapse" name="MyRestApi" context="/practice"> 
<resource methods="GET" uri-template="/{someValue}"> 
    <inSequence> 
    <header name="Action" value="urn:sayHello"/> 
    <payloadFactory media-type="xml"> 
     <format> 
      <p:sayHello xmlns:p="http://practice"> 
       <p:inputString>$1</p:inputString> 
      </p:sayHello> 
     </format> 
     <args> 
      <arg evaluator="xml" expression="$ctx:uri.var.someValue"/> 
     </args> 
    </payloadFactory> 
    <log level="full"/> 
    <call> 
     <endpoint> 
      <address uri="http://192.168.0.105:9763/services/Practice/sayHello" format="soap12"/> 
     </endpoint> 
    </call> 
    <enrich> 
     <source type="body" clone="true"/> 
     <target type="property" action="child" property="body_of_first_call"/> 
    </enrich> 
    <property xmlns:ns="http://practice" name="response" expression="//ns:return" scope="default" type="STRING"/> 
    <property xmlns:ns="http://practice" name="response2" expression="//ns:sayHelloResponse" scope="default" type="STRING"/> 
    <log> 
     <property name="myValue" expression="$ctx:response"/> 
     <property name="myValue2" expression="$ctx:response2"/> 
     <property name="myValue3" expression="$ctx:body_of_first_call"/> 
    </log> 
    <payloadFactory media-type="xml"> 
     <format> 
      <result> 
       <sentValue>$1</sentValue> 
       <returnedValue>$2</returnedValue> 
      </result> 
     </format> 
     <args> 
      <arg evaluator="xml" expression="$ctx:uri.var.someValue"/> 
      <arg evaluator="xml" expression="$ctx:response"/> 
     </args> 
    </payloadFactory> 
    <property name="messageType" value="application/xml" scope="axis2" type="STRING"/> 
    <respond/> 
    </inSequence> 
    <outSequence/> 
    <faultSequence/> 
</resource> 
</api> 

幾乎完全基於引導發現here

這是在這一點上只是試圖抓住連接器和API的概念所以我可以將它應用於我在工作中所做的事情,但我遇到了一些障礙。任何嘗試與外部SOAP服務進行通信(ESB需要執行的操作),都無法找到端點或無法傳遞SOAP信封中的值。

如上所述,代碼將查找端點,但請求中的輸入值inputString始終爲空。它與將該地址放入瀏覽器中完全相同,完全省略了SOAP信封,然而,記錄該調用會按預期方式將信封打印到控制檯,因此信封正在生成但未進入應用程序服務器。

事情我也都試過:

1)改變端點地址是服務端點,而不是特定的操作。這會導致AS發生錯誤,聲稱無法找到操作。此端點和操作在SoapUI中按預期工作。

2)使用WSDL端點而不是地址。結果與1相同。

3)添加/刪除標題標籤。所有三個端點都已嘗試使用/不使用標題標記。他們的結果不會改變。

在這一點上,我已經窮盡了我對ESB的理解。

回答

2

爲了調用我的服務,我以這種方式設置了我的中介。

<call blocking="true"> 
    <endpoint> 
    <address uri="http://169.254.193.10:9769/services/ServicePharmacy" format="soap11"/> 
    </endpoint> 
</call> 

在真正的粘連性做同步消息

<call blocking="true"> 

</call> 

這是我的API

<api xmlns="http://ws.apache.org/ns/synapse" name="showByIdCallMediator" context="/getByIdCall"> 
    <resource methods="GET" uri-template="/{Id}"> 
     <inSequence> 
     <property name="getId" expression="get-property('uri.var.Id')" scope="default" type="STRING"/> 
     <log> 
      <property name="ID" expression="get-property('getId')"/> 
     </log> 
     <payloadFactory media-type="xml"> 
      <format> 
       <p:searchPharmacy xmlns:p="http://pharmacy.arce.org"> 
        <ax22:pharmacy xmlns:ax22="http://pharmacy.arce.org"> 
        <xs:id xmlns:xs="http://pharmacy.arce.org/xsd">$1</xs:id> 
        </ax22:pharmacy> 
       </p:searchPharmacy> 
      </format> 
      <args> 
       <arg evaluator="xml" expression="get-property('getId')"/> 
      </args> 
     </payloadFactory>   
     <header name="Action" scope="default" value="urn:searchPharmacy"/>   
     <call blocking="true"> 
      <endpoint> 
       <address uri="http://169.254.193.10:9769/services/ServicePharmacy" format="soap11"/> 
      </endpoint> 
     </call> 
     <log> 
      <property xmlns:ns="http://org.apache.synapse/xsd" name="Status" expression="get-property('axis2','HTTP_SC')"/> 
     </log> 
     <log level="full"/> 
     <enrich> 
      <source type="body" clone="true"/> 
      <target type="property" property="Ouput_Respose_Service"/> 
     </enrich> 
     <log level="custom" separator=","> 
      <property name="Service_Response" expression="get-property('Ouput_Respose_Service')"/> 
     </log> 
     <respond description=""/> 
     </inSequence> 
     <outSequence> 
     <log level="full"/> 
     <send/> 
     </outSequence> 
     <faultSequence> 
     <sequence key="{faultSEQ}"/> 
     </faultSequence> 
    </resource> 
</api>