WSO2 ESB 调用参数化端点 Looping on Parameters
WSO2 ESB calling parameterized endpoint Looping on Parameters
在我的用例中,我必须链接两个服务调用。特别是:
1) 第一个调用 returns 一个 xml 列出了几个 ID
2) 我必须遍历返回的 ID 列表并为每个 id-item 进行 ID 参数化服务调用。
3) 最后,我必须收集由每个 ID-service-response 组成的完整响应。
假设第一个服务调用 returns 响应如下:
<result>
<Link>
<Id>93451</Id>
</Link>
<Link>
<Id>93450</Id>
</Link>
...
第二步是像这样对参数化端点执行一系列调用:
http://myEndpoint/entry/eutils/efetch.fcgi?db=pubmed&rettype=abstract&retmode=xml&id=<ID>
每个调用 returns 的 xml 响应如下:
<response>
<field1>value1</field1>
<field2>value2</field2>
<field3>value3</field3>
<response>
我必须收集像这样的完整回复:
<finalResponse>
<response>
<field1>value1</field1>
<field2>value2</field2>
<field3>value3</field3>
<response>
<response>
<field1>value1</field1>
<field2>value2</field2>
<field3>value3</field3>
<response>
<response>
<field1>value1</field1>
<field2>value2</field2>
<field3>value3</field3>
<response>
</finalResponse>
我该怎么办?你能给我举个例子吗?谢谢
您需要结合使用迭代中介和聚合中介。这是一个示例代码,但您可能需要进行一些修改才能使其满足您的要求。
<definitions xmlns="http://ws.apache.org/ns/synapse">
<proxy name="SampleProxy">
<target>
<inSequence>
<iterate expression="//result/link/id" preservePayload="true"
attachPath="//link">
<target>
<property name="uri.var.servicepath" expression="//link/id/text()"/>
<sequence>
<send>
<endpoint key="MyEndpoint"/>
</send>
</sequence>
</target>
</iterate>
</inSequence>
<outSequence>
<property name="FinalResponse" scope="default">
<finalResponse />
</property>
<aggregate>
<onComplete expression="//response"
enclosingElementProperty="FinalResponse">
<send/>
</onComplete>
</aggregate>
</outSequence>
</target>
</proxy>
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="MyEndpoint">
<http uri-template="http://myEndpoint/entry/eutils/efetch.fcgi?db=pubmed&rettype=abstract&retmode=xml&id={ID}" method="GET">
</http>
</endpoint>
</definitions>
在我的用例中,我必须链接两个服务调用。特别是:
1) 第一个调用 returns 一个 xml 列出了几个 ID
2) 我必须遍历返回的 ID 列表并为每个 id-item 进行 ID 参数化服务调用。
3) 最后,我必须收集由每个 ID-service-response 组成的完整响应。
假设第一个服务调用 returns 响应如下:
<result>
<Link>
<Id>93451</Id>
</Link>
<Link>
<Id>93450</Id>
</Link>
...
第二步是像这样对参数化端点执行一系列调用:
http://myEndpoint/entry/eutils/efetch.fcgi?db=pubmed&rettype=abstract&retmode=xml&id=<ID>
每个调用 returns 的 xml 响应如下:
<response>
<field1>value1</field1>
<field2>value2</field2>
<field3>value3</field3>
<response>
我必须收集像这样的完整回复:
<finalResponse>
<response>
<field1>value1</field1>
<field2>value2</field2>
<field3>value3</field3>
<response>
<response>
<field1>value1</field1>
<field2>value2</field2>
<field3>value3</field3>
<response>
<response>
<field1>value1</field1>
<field2>value2</field2>
<field3>value3</field3>
<response>
</finalResponse>
我该怎么办?你能给我举个例子吗?谢谢
您需要结合使用迭代中介和聚合中介。这是一个示例代码,但您可能需要进行一些修改才能使其满足您的要求。
<definitions xmlns="http://ws.apache.org/ns/synapse">
<proxy name="SampleProxy">
<target>
<inSequence>
<iterate expression="//result/link/id" preservePayload="true"
attachPath="//link">
<target>
<property name="uri.var.servicepath" expression="//link/id/text()"/>
<sequence>
<send>
<endpoint key="MyEndpoint"/>
</send>
</sequence>
</target>
</iterate>
</inSequence>
<outSequence>
<property name="FinalResponse" scope="default">
<finalResponse />
</property>
<aggregate>
<onComplete expression="//response"
enclosingElementProperty="FinalResponse">
<send/>
</onComplete>
</aggregate>
</outSequence>
</target>
</proxy>
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="MyEndpoint">
<http uri-template="http://myEndpoint/entry/eutils/efetch.fcgi?db=pubmed&rettype=abstract&retmode=xml&id={ID}" method="GET">
</http>
</endpoint>
</definitions>