WSO2 EI/ESB - 依次调用多个端点生成自定义对象
WSO2 EI/ESB - Calling multiple endpoints in sequence to generate a custom object
我想要达到的目标:
使用 Enterprise Integrator API,我想将来自两个数据服务端点(称为 ORDERS 和 METADATAS)的数据组合成一个自定义对象,如下所示:
[
{
Order: {},
Metadata: {}
}, ...
]
API 目前只接受一个参数,USER_ID
。
当我 运行 处于阻塞模式的 <call>
调解器时,我遇到以下问题:
Current Params: {USER_ID={1,1}, ID=test}
或
Current Params: {USER_ID={test,1}}
在非阻塞模式下,第一次调用成功,第二次调用无法进行。它似乎无法从 URL 或存储的 属性 访问 USER_ID
参数。我认为属性应该保留值?
请注意,日志中的值是 100% 准确的(USER_ID 属性 显示正确值)。
INFO {org.apache.synapse.mediators.builtin.LogMediator} - _TEST = 1, _TEST2 = 1, _TEST3 = 1
这是到目前为止我得到的 inSequence 的信息:
<resource methods="GET" uri-template="/test?USER_ID={USER_ID}">
<inSequence>
<property expression="get-property('query.param.USER_ID')" name="USER_ID" scope="default" type="STRING"/>
<property expression="$url:USER_ID" name="uri.var.USER_ID" scope="default" type="STRING"/>
<call blocking="true">
<endpoint>
<http method="get" statistics="enable" trace="enable" uri-template="https://localhost:8243/services/ORDERS_DataService/user/{query.param.USER_ID}"/>
</endpoint>
</call>
<log level="custom">
<property expression="get-property('USER_ID')" name="_TEST"/>
<property expression="get-property('query.param.USER_ID')" name="_TEST2"/>
<property expression="get-property('uri.var.USER_ID')" name="_TEST3"/>
</log>
<enrich>
<source clone="false" type="body"/>
<target property="_ORDERS" type="property"/>
</enrich>
<filter regex="200" source="get-property('axis2', 'HTTP_SC')">
<then>
<log level="custom">
<property name="switchlog" value="Case: first call successful"/>
</log>
<call blocking="true">
<endpoint>
<http method="get" statistics="enable" trace="enable" uri-template="https://localhost:8243/services/ORDERS_DataService/metadata/user/{query.param.USER_ID}"/>
</endpoint>
</call>
<enrich>
<source clone="false" type="body"/>
<target property="_METADATAS" type="property"/>
</enrich>
<log level="custom">
<property expression="get-property('_METADATAS')" name="_METADATAS"/>
</log>
</then>
<else/>
</filter>
</inSequence>
</resource>
我尝试了什么?
在 <call>
的两个 uri 模板中使用 {USER_ID}
、{uri.var.USER_ID}
、{$url:USER_ID}
和 {query.param.USER_ID}
。
尝试了非阻塞和阻塞模式,得到不同的结果。
我的问题只是(目前)调用两个序列并分配给属性。
我计划通过迭代将它们全部放在一起,并像下面这样将属性映射到我正在寻找的数组中的每个项目:
<!-- Assuming iterate provides _ORDER and _METADATA whilst looping -->
<format>
{
"Order":"",
"Metadata":""
}
</format>
<args>
<arg expression="get-property('_ORDER')"/>
<arg expression="get-property('_METADATA')"/>
</args>
如果这不起作用,我打算评估这两个项目的 XSLT 转换,但我还没有想到那么远,坚持两个调用不正常。
我找到了问题的答案。在文档 [1]:
中发现了这条奇怪的线
<property name="REST_URL_POSTFIX" scope="axis2" action="remove"/>
抓取查询参数后立即添加它有效!它完全按照它说的去做,显然默认情况下应用了 Postfix。现在寻找一种全局方法来自动关闭它!
参考文献:
[1] https://docs.wso2.com/display/EI650/Configuring+Specific+Use+Cases
我想要达到的目标:
使用 Enterprise Integrator API,我想将来自两个数据服务端点(称为 ORDERS 和 METADATAS)的数据组合成一个自定义对象,如下所示:
[
{
Order: {},
Metadata: {}
}, ...
]
API 目前只接受一个参数,USER_ID
。
当我 运行 处于阻塞模式的 <call>
调解器时,我遇到以下问题:
Current Params: {USER_ID={1,1}, ID=test}
或
Current Params: {USER_ID={test,1}}
在非阻塞模式下,第一次调用成功,第二次调用无法进行。它似乎无法从 URL 或存储的 属性 访问 USER_ID
参数。我认为属性应该保留值?
请注意,日志中的值是 100% 准确的(USER_ID 属性 显示正确值)。
INFO {org.apache.synapse.mediators.builtin.LogMediator} - _TEST = 1, _TEST2 = 1, _TEST3 = 1
这是到目前为止我得到的 inSequence 的信息:
<resource methods="GET" uri-template="/test?USER_ID={USER_ID}">
<inSequence>
<property expression="get-property('query.param.USER_ID')" name="USER_ID" scope="default" type="STRING"/>
<property expression="$url:USER_ID" name="uri.var.USER_ID" scope="default" type="STRING"/>
<call blocking="true">
<endpoint>
<http method="get" statistics="enable" trace="enable" uri-template="https://localhost:8243/services/ORDERS_DataService/user/{query.param.USER_ID}"/>
</endpoint>
</call>
<log level="custom">
<property expression="get-property('USER_ID')" name="_TEST"/>
<property expression="get-property('query.param.USER_ID')" name="_TEST2"/>
<property expression="get-property('uri.var.USER_ID')" name="_TEST3"/>
</log>
<enrich>
<source clone="false" type="body"/>
<target property="_ORDERS" type="property"/>
</enrich>
<filter regex="200" source="get-property('axis2', 'HTTP_SC')">
<then>
<log level="custom">
<property name="switchlog" value="Case: first call successful"/>
</log>
<call blocking="true">
<endpoint>
<http method="get" statistics="enable" trace="enable" uri-template="https://localhost:8243/services/ORDERS_DataService/metadata/user/{query.param.USER_ID}"/>
</endpoint>
</call>
<enrich>
<source clone="false" type="body"/>
<target property="_METADATAS" type="property"/>
</enrich>
<log level="custom">
<property expression="get-property('_METADATAS')" name="_METADATAS"/>
</log>
</then>
<else/>
</filter>
</inSequence>
</resource>
我尝试了什么?
在 <call>
的两个 uri 模板中使用 {USER_ID}
、{uri.var.USER_ID}
、{$url:USER_ID}
和 {query.param.USER_ID}
。
尝试了非阻塞和阻塞模式,得到不同的结果。
我的问题只是(目前)调用两个序列并分配给属性。
我计划通过迭代将它们全部放在一起,并像下面这样将属性映射到我正在寻找的数组中的每个项目:
<!-- Assuming iterate provides _ORDER and _METADATA whilst looping -->
<format>
{
"Order":"",
"Metadata":""
}
</format>
<args>
<arg expression="get-property('_ORDER')"/>
<arg expression="get-property('_METADATA')"/>
</args>
如果这不起作用,我打算评估这两个项目的 XSLT 转换,但我还没有想到那么远,坚持两个调用不正常。
我找到了问题的答案。在文档 [1]:
中发现了这条奇怪的线<property name="REST_URL_POSTFIX" scope="axis2" action="remove"/>
抓取查询参数后立即添加它有效!它完全按照它说的去做,显然默认情况下应用了 Postfix。现在寻找一种全局方法来自动关闭它!
参考文献:
[1] https://docs.wso2.com/display/EI650/Configuring+Specific+Use+Cases