如何在 wso2 esb 中合并两个查询
How to combine two queries in wso2 esb
我是 wso2 的新手,可能我的问题很简单,但我已经为此奋斗了一个星期。问题是我必须在 ESB 4.9.0 中组合两个有效载荷。
我已经尝试使用以前查询的参数来丰富、创建新的 payloadFactory,但是这一切都没有按照我想要的方式进行。问题是我必须从 DS 获取学生数据并从 API 生成密码(基于学生 ID)。所有这些都必须合并到一个有效负载中并转发到 xslt 转换。例如,我从 DS 得到这个:
<student>
<try>
<st_id>123456</st_id>
<name>Michael</name>
<surname>Smith</surname>
<email>email@email.com</email>
<ssn>123456789</ssn>
<faculty name="IT">
<field>Programming</field>
<f_code>IT-1234-19</f_code>
</faculty>
</try>
</student>
有时学生在一个研究领域只能选择一个系,但有些学生可以选择两个不同的系:
<student>
<try>
<st_id>121234</st_id>
<name>John</name>
<surname>Doe</surname>
<email>jd@email.com</email>
<ssn>764896536</ssn>
<faculty name="Management">
<field>Production engineering</field>
<f_code>MN-1234-19</f_code>
</faculty>
</try>
<try>
<st_id>121234</st_id>
<name>John</name>
<surname>Doe</surname>
<email>jd@email.com</email>
<ssn>764896536</ssn>
<faculty name="IT">
<field>Electronics</field>
<f_code>IT-4321-19</f_code>
</faculty>
</try>
</student>
API 给我:
{"HASH":"{SSHA}PTFOuvF/20MrSGbTkQTkeBUC8A/0mfKF"}
预期结果:
在学生节点 f 内的任何位置添加一个 HASH,例如:
<student>
<try>
<st_id>123456</st_id>
<name>Michael</name>
<surname>Smith</surname>
<email>email@email.com</email>
<ssn>123456789</ssn>
<faculty name="IT">
<field>Programming</field>
<f_code>IT-1234-19</f_code>
</faculty>
</try>
<hash>{SSHA}PTFOuvF/20MrSGbTkQTkeBUC8A/0mfKF</hash>
</student>
我的代码是:
<inSequence>
<property expression="json-eval($.Numb)" name="Numb" scope="default" type="STRING"/>
<payloadFactory media-type="xml">
<format>
<v1:getStudentRequest xmlns:v1="http://localhost/contract/ldap/v1">
<v1:Numb></v1:Numb>
</v1:getStudentRequest>
</format>
<args>
<arg evaluator="xml" expression="get-property('uri.var.Numb')"/>
</args>
</payloadFactory>
<header name="Action" scope="default" value="urn:getStudentRequest"/>
<call>
<endpoint>
<address uri="http://localhost:9769/services/LdapDS.SOAP11Endpoint" format="soap11"/>
</endpoint>
</call>
<enrich>
<source type="body" clone="true"/>
<target type="property" property="Student"/>
</enrich>
<property name="DISABLE_CHUNKING" value="true" scope="axis2"/>
<call xmlns:v1="http://localhost/contract/ldap/v1">
<endpoint xmlns:v1="http://localhost/contract/ldap/v1">
<http uri-template="http://localhost:39080/ldap/passgen/{uri.var.Numb}" method="GET" format="pox"></http>
</endpoint>
</call>
<property evaluator="json" name="password" scope="default" expression="json-eval($.HASH)"/>
<filter source="get-property('password')" regex="^$">
<then>
<log level="custom">
<property expression="get-property('Numb')" name="Numb"/>
</log>
</then>
<else>
<property evaluator="json" name="pass" scope="default" expression="json-eval($.HASH)"/>
</else>
</filter>
<!--
<payloadFactory media-type="xml">
<format>
<m0:password xmlns:m0="http://localhost/contract/ldap/v1"></m0:password>
</format>
<args>
<arg evaluator="xml" expression="get-property('pass')"/>
</args>
</payloadFactory>
-->
<enrich>
<source xpath="$body" clone="true"/>
<target action="child" type="custom" xpath="$Student//student/try"/>
</enrich>
<enrich>
<source type="property" clone="true" property="Student"/>
<target action="replace" type="body"/>
</enrich>
<xslt key="ldapXSL"/>
<respond/>
</inSequence>
结果我只得到了一个HASH :(
以下包含满足您要求的中介示例。请参考以下内容并制定您的调解。分析提供的配置,似乎突触工件中存在错误配置(例如:-xpath="$Student//student/try"),但您实现的逻辑是正确的。
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="testProxy"
startOnLoad="true"
statistics="disable"
trace="disable"
transports="http,https">
<target>
<inSequence>
<log level="full"/>
<call>
<endpoint>
<http uri-template="http://www.mocky.io/v2/5dc6d3963800001c35cdec56"/>
</endpoint>
</call>
<enrich>
<source clone="true" type="body"/>
<target property="property1" type="property"/>
</enrich>
<call>
<endpoint>
<http uri-template="http://www.mocky.io/v2/5dc6d4723800004a00cdec59"/>
</endpoint>
</call>
<property name="messageType" scope="axis2" value="application/xml"/>
<enrich>
<source clone="true" xpath="$body//HASH"/>
<target action="child" xpath="$ctx:property1"/>
</enrich>
<enrich>
<source clone="true" property="property1" type="property"/>
<target type="body"/>
</enrich>
<log level="custom">
<property expression="$ctx:property1" name="**-----**"/>
</log>
<respond/>
</inSequence>
</target>
<description/>
</proxy>
上述代理由类似于您提到的模拟后端响应组成。希望这有帮助
我是 wso2 的新手,可能我的问题很简单,但我已经为此奋斗了一个星期。问题是我必须在 ESB 4.9.0 中组合两个有效载荷。
我已经尝试使用以前查询的参数来丰富、创建新的 payloadFactory,但是这一切都没有按照我想要的方式进行。问题是我必须从 DS 获取学生数据并从 API 生成密码(基于学生 ID)。所有这些都必须合并到一个有效负载中并转发到 xslt 转换。例如,我从 DS 得到这个:
<student>
<try>
<st_id>123456</st_id>
<name>Michael</name>
<surname>Smith</surname>
<email>email@email.com</email>
<ssn>123456789</ssn>
<faculty name="IT">
<field>Programming</field>
<f_code>IT-1234-19</f_code>
</faculty>
</try>
</student>
有时学生在一个研究领域只能选择一个系,但有些学生可以选择两个不同的系:
<student>
<try>
<st_id>121234</st_id>
<name>John</name>
<surname>Doe</surname>
<email>jd@email.com</email>
<ssn>764896536</ssn>
<faculty name="Management">
<field>Production engineering</field>
<f_code>MN-1234-19</f_code>
</faculty>
</try>
<try>
<st_id>121234</st_id>
<name>John</name>
<surname>Doe</surname>
<email>jd@email.com</email>
<ssn>764896536</ssn>
<faculty name="IT">
<field>Electronics</field>
<f_code>IT-4321-19</f_code>
</faculty>
</try>
</student>
API 给我:
{"HASH":"{SSHA}PTFOuvF/20MrSGbTkQTkeBUC8A/0mfKF"}
预期结果: 在学生节点 f 内的任何位置添加一个 HASH,例如:
<student>
<try>
<st_id>123456</st_id>
<name>Michael</name>
<surname>Smith</surname>
<email>email@email.com</email>
<ssn>123456789</ssn>
<faculty name="IT">
<field>Programming</field>
<f_code>IT-1234-19</f_code>
</faculty>
</try>
<hash>{SSHA}PTFOuvF/20MrSGbTkQTkeBUC8A/0mfKF</hash>
</student>
我的代码是:
<inSequence>
<property expression="json-eval($.Numb)" name="Numb" scope="default" type="STRING"/>
<payloadFactory media-type="xml">
<format>
<v1:getStudentRequest xmlns:v1="http://localhost/contract/ldap/v1">
<v1:Numb></v1:Numb>
</v1:getStudentRequest>
</format>
<args>
<arg evaluator="xml" expression="get-property('uri.var.Numb')"/>
</args>
</payloadFactory>
<header name="Action" scope="default" value="urn:getStudentRequest"/>
<call>
<endpoint>
<address uri="http://localhost:9769/services/LdapDS.SOAP11Endpoint" format="soap11"/>
</endpoint>
</call>
<enrich>
<source type="body" clone="true"/>
<target type="property" property="Student"/>
</enrich>
<property name="DISABLE_CHUNKING" value="true" scope="axis2"/>
<call xmlns:v1="http://localhost/contract/ldap/v1">
<endpoint xmlns:v1="http://localhost/contract/ldap/v1">
<http uri-template="http://localhost:39080/ldap/passgen/{uri.var.Numb}" method="GET" format="pox"></http>
</endpoint>
</call>
<property evaluator="json" name="password" scope="default" expression="json-eval($.HASH)"/>
<filter source="get-property('password')" regex="^$">
<then>
<log level="custom">
<property expression="get-property('Numb')" name="Numb"/>
</log>
</then>
<else>
<property evaluator="json" name="pass" scope="default" expression="json-eval($.HASH)"/>
</else>
</filter>
<!--
<payloadFactory media-type="xml">
<format>
<m0:password xmlns:m0="http://localhost/contract/ldap/v1"></m0:password>
</format>
<args>
<arg evaluator="xml" expression="get-property('pass')"/>
</args>
</payloadFactory>
-->
<enrich>
<source xpath="$body" clone="true"/>
<target action="child" type="custom" xpath="$Student//student/try"/>
</enrich>
<enrich>
<source type="property" clone="true" property="Student"/>
<target action="replace" type="body"/>
</enrich>
<xslt key="ldapXSL"/>
<respond/>
</inSequence>
结果我只得到了一个HASH :(
以下包含满足您要求的中介示例。请参考以下内容并制定您的调解。分析提供的配置,似乎突触工件中存在错误配置(例如:-xpath="$Student//student/try"),但您实现的逻辑是正确的。
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="testProxy"
startOnLoad="true"
statistics="disable"
trace="disable"
transports="http,https">
<target>
<inSequence>
<log level="full"/>
<call>
<endpoint>
<http uri-template="http://www.mocky.io/v2/5dc6d3963800001c35cdec56"/>
</endpoint>
</call>
<enrich>
<source clone="true" type="body"/>
<target property="property1" type="property"/>
</enrich>
<call>
<endpoint>
<http uri-template="http://www.mocky.io/v2/5dc6d4723800004a00cdec59"/>
</endpoint>
</call>
<property name="messageType" scope="axis2" value="application/xml"/>
<enrich>
<source clone="true" xpath="$body//HASH"/>
<target action="child" xpath="$ctx:property1"/>
</enrich>
<enrich>
<source clone="true" property="property1" type="property"/>
<target type="body"/>
</enrich>
<log level="custom">
<property expression="$ctx:property1" name="**-----**"/>
</log>
<respond/>
</inSequence>
</target>
<description/>
</proxy>
上述代理由类似于您提到的模拟后端响应组成。希望这有帮助