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