Я пытался выяснить, как заставить ESB WSO2 совершать звонки на два разных API и объединять их результаты в один отклик и работать без проблем. По своей сути, у меня есть два движки, которые я делаю запросы, которые отвечают что-то вроде этого:Объедините два запроса с использованием WSO2 ESB
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<response xmlns="http://example.com/response">
<query name="items" xmlns="http://example.com/query">
<row>
<id>1</id>
<name>Item 1</name>
</row>
<row>
<id>2</id>
<name>Item 2</name>
</row>
</query>
</response>
</soapenv:Body>
</soapenv:Envelope>
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<response xmlns="http://example.com/response">
<query name="parts" xmlns="http://example.com/query">
<row>
<id>1</id>
<part>Part 1.1</part>
</row>
<row>
<id>1</id>
<part>Part 1.2</part>
</row>
<row>
<id>1</id>
<part>Part 1.3</part>
</row>
<row>
<id>2</id>
<part>Part 2.1</part>
</row>
<row>
<id>2</id>
<part>Part 2.2</part>
</row>
</query>
</response>
</soapenv:Body>
</soapenv:Envelope>
I 'd хотел бы попросить обоих из них, а затем объединить их результаты, чтобы выглядеть примерно так:
<items>
<item>
<id>1</id>
<name>Item 1</name>
<parts>
<part>
<id>1</id>
<name>Part 1.1</name>
</part>
<part>
<id>1</id>
<name>Part 1.2</name>
</part>
<part>
<id>1</id>
<name>Part 1.3</name>
</part>
</parts>
</item>
<item>
<id>2</id>
<name>Item 2</name>
<parts>
<part>
<id>2</id>
<name>Part 2.1</name>
</part>
<part>
<id>2</id>
<name>Part 2.2</name>
</part>
</parts>
</item>
</items>
В принципе, каждый ответ от обоих API имеет список row
s, каждый из которых содержит элемент id
. id
s в вызове /items
являются уникальными в пределах этого ответа, и каждая строка в ответе от parts
имеет номер id
, который связывает его с строкой от /items
.
Я получил следующее определение API в ESB:
<?xml version="1.0" encoding="UTF-8"?>
<api context="/item_list" name="ItemList" xmlns="http://ws.apache.org/ns/synapse">
<resource methods="POST" uri-template="/">
<inSequence>
<header name="Content-Type" scope="transport" value="text/xml; charset=utf-8"/>
<clone>
<target>
<sequence>
<send>
<endpoint>
<address format="soap11" uri="http://example.com/items"/>
</endpoint>
</send>
</sequence>
</target>
<target>
<sequence>
<send>
<endpoint>
<address format="soap11" uri="http://example.com/parts"/>
</endpoint>
</send>
</sequence>
</target>
</clone>
</inSequence>
<outSequence>
<aggregate>
<correlateOn expression="//*[name()='response']/*[name()='query']/*[name()='row']/*[name()='id']" />
<completeCondition>
<messageCount max="2" min="2"/>
</completeCondition>
<onComplete expression="//*[name()='response']/*[name()='query']/*[name()='row']">
<send/>
</onComplete>
</aggregate>
</outSequence>
<faultSequence/>
</resource>
</api>
inSequence здесь сильно упрощены, но это отправить два действительных запросов и получает обратно ожидаемые ответы. OutSequence, поскольку он написан здесь, никогда не отправляет ответ клиенту или не регистрирует ошибку на сервере. Если я удалю элемент correlateOn
с aggregate
, я вернусь к одному row
, казалось бы, случайным образом, из одного из двух вызовов API. I думаюcorrelateOn
- это то, что я хочу использовать здесь, но я не могу найти никакой полезной документации на нем из WSO2 или Apache, поэтому я уверен, что использую его неправильно. Мой фон XPath довольно слаб, поэтому я уверен, что выражение также может использовать некоторую работу.
Я, по крайней мере, на правильном пути здесь с клоном/агрегатным рисунком? Как мне совместить результаты этих двух запросов с чем-то похожим на мой пример? Если я смогу получить что-то вроде близкого расстояния, я смогу сделать все остальное с помощью XSLT.
Это отлично работает! Спасибо за подробный ответ; это объясняет все, что мне не хватало. –
рад слышать, что он работает на вас. С уважением. –