WSO2のESBで2つの異なるAPIを呼び出す方法を理解し、その結果を1つのレスポンスにまとめ、私はWSO2を使用して2つのクエリを結合する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="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>
:
<?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>
http://example.com/partsその最も基本的で、私は私はこのようなこと応答の何かに要求を作っている2つのバックエンドを持っています両方をリクエストして、その結果を組み合わせて次のように表示します:
<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
のリストがあり、それぞれにid
要素が含まれています。 /items
への呼び出しのid
は、その応答内で一意であり、parts
の応答の各行は、/items
の行に結びつくid
を持っています。
<?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が大きく簡略化され、それは2つの有効なクエリを送信し、期待応答を取り戻す:
私は、ESBで、次のAPIの定義を持っています。ここに記述されているoutSequenceは、クライアントに応答を送信したり、サーバーにエラーを記録したりすることはありません。 aggregate
からcorrelateOn
要素を削除した場合、2つのAPI呼び出しのうちの1つで、一見無作為に1つのrow
が返されます。私はと思うcorrelateOn
私がここで使用したいものですが、私はWSO2またはApacheから有用なドキュメントを見つけることができないので、私はそれを間違って使用していると確信しています。私のXPathの背景はかなり弱いので、表現にもいくつかの作業を使うことができると確信しています。
私はここでクローン/集約パターンで少なくとも正しいトラックにいますか?これらの2つのクエリの結果を私の例に似たものに組み合わせるにはどうすればよいですか?もし私が何かを近くでも得ることができれば、私はXSLTで残りをすることができるはずです。
これは完璧に動作します!詳細な応答をありがとう。これは私が行方不明だったすべてを説明します。 –
うれしいことを聞いてうれしいです。敬具。 –