序列中的第二个服务调用不会传播http标头

时间:2015-11-13 17:19:51

标签: wso2 wso2esb wso2-am synapse

我在WSO2 Api Manager中创建一个序列,需要接收请求A,将此请求转换为B并将其发送到服务S1。当响应到来时,我需要根据响应主体更新原始请求的一些元素,并将其发送到服务S2。

我试图建立这样的序列,而我几乎就在那里。我唯一的问题是第二部分:我的标题丢失了,它们没有传递给S2(但它们被传递给S1)。如何在第二次调用中保留标题,或者我可能做错了什么?

orignial RQ - >建立一个新的RQ - >发送到S1 - >丰富原始RQ - >发送到S2

<sequence name="CustomSequence" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <property expression="json-eval($.)" name="Message" scope="default" type="STRING"/>
    <class description="MyCustomMediator" name="com.sample.MyCustomMediator"/>
    <payloadFactory description="MyRequestUpdater" media-type="json">
       <format>$1</format>
       <args>
           <arg evaluator="xml" expression="get-property('MY_SECRET_DATA')"/>
       </args>
    </payloadFactory>
    <call>
       <endpoint>
           <http method="post" trace="disable" uri-template="https://<url to service S1>"/>
       </endpoint>
   </call>
   <property expression="json-eval($.)" name="ResponseFromS1" scope="default" type="STRING"/>
   <class description="MyCustomMediator2" name="com.sample.MyCustomMediator2"/>
   <send>
       <endpoint>
            <http trace="disable" uri-template="http://<url to service S2>"/>
       </endpoint>
   </send>
</sequence>

1 个答案:

答案 0 :(得分:0)

将标题保存在属性中并在S2之前重新设置。 S1重写您的标题,您需要从s1删除标题并再次设置标题。 例如:

<property name="header1" expression="get-property('transport','name-of-header')" type="STRING" /> 
<property name="header2" expression="get-property('transport','name-of-header2')" type="STRING" /> 
...
<S1>
<!-- this property remove all transport headers that S1 makes -->
<property action="remove" name="TRANSPORT_HEADERS" scope="axis2"/>
<property name="name-of-header" scope="transport" expression="get-property('header1')" type="STRING" />
<property name="name-of-header" scope="transport" expression="get-property('header2')" type="STRING" />
<S2>