You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2微集成器代理服务InSequence多API调用及响应修改问询

问题解答

1. 能否在InSequence中调用多个API?

当然可以。WSO2 Micro Integrator的<call> mediator支持在InSequence中串行调用多个外部API,你的代码思路是可行的,但存在几个需要调整的细节:

  • 若Post API需要原始字符串列表作为请求体,你当前用payloadFactory把Get响应包成{"response": [...]}的格式可能不符合要求,需根据Post API的预期结构调整。
  • 将$body存储到response属性时,使用STRING类型可能导致JSON结构丢失,建议改用OM类型(XML/JSON节点)或者直接传递消息体。
  • 缺少Post API响应后添加额外字段的逻辑,以及错误处理分支。

修正后的Proxy Service代码

<?xml version="1.0" encoding="UTF-8"?>
<proxy name="ErpProxyService" startOnLoad="true" statistics="enable" trace="enable" transports="http https" xmlns="http://ws.apache.org/ns/synapse">
    <target>
        <inSequence>
            <!-- 日志:任务启动 -->
            <log level="custom">
                <property name="ERPScheduler" value="ERP Scheduler started"/>
            </log>

            <!-- 构建API地址 -->
            <property expression="concat(get-property('file', 'BaseUrl'), get-property('file', 'getonebillchallans'))" name="uri.var.getApiUrl" scope="default" type="STRING"/>
            <property expression="concat(get-property('file', 'BaseUrl'), get-property('file', 'getErpData'))" name="uri.var.postApiUrl" scope="default" type="STRING"/>

            <log level="custom">
                <property expression="get-property('uri.var.getApiUrl')" name="Get API URL"/>
                <property expression="get-property('uri.var.postApiUrl')" name="Post API URL"/>
            </log>

            <!-- 调用Get API,获取字符串列表 -->
            <log level="custom">
                <property name="API call" value="Calling Get1BillChallanAPI"/>
            </log>
            <call>
                <endpoint>
                    <http method="get" uri-template="{uri.var.getApiUrl}">
                        <suspendOnFailure>
                            <initialDuration>-1</initialDuration>
                            <progressionFactor>-1</progressionFactor>
                            <maximumDuration>0</maximumDuration>
                        </suspendOnFailure>
                        <markForSuspension>
                            <retriesBeforeSuspension>0</retriesBeforeSuspension>
                        </markForSuspension>
                    </http>
                </endpoint>
            </call>
            <log level="full" category="INFO" message="Get API Response"/>

            <!-- 若Post API需要原始列表,跳过此payloadFactory;若需要包装后的格式则保留 -->
            <!-- <payloadFactory media-type="json">
                <format>{"response": $1}</format>
                <args>
                    <arg evaluator="json" expression="$"/>
                </args>
            </payloadFactory> -->

            <!-- 调用Post API,传递Get API的响应作为请求体 -->
            <log level="custom">
                <property name="API call" value="Calling GetERPdata (Post API)"/>
            </log>
            <call>
                <endpoint>
                    <http method="post" uri-template="{uri.var.postApiUrl}">
                        <suspendOnFailure>
                            <initialDuration>-1</initialDuration>
                            <progressionFactor>-1</progressionFactor>
                            <maximumDuration>0</maximumDuration>
                        </suspendOnFailure>
                        <markForSuspension>
                            <retriesBeforeSuspension>0</retriesBeforeSuspension>
                        </markForSuspension>
                    </http>
                </endpoint>
            </call>
            <log level="full" category="INFO" message="Post API Original Response"/>

            <!-- 给Post API响应添加额外字段 -->
            <payloadFactory media-type="json">
                <format>{"original_response": $1, "extra_field": "custom_value", "timestamp": $2}</format>
                <args>
                    <arg evaluator="json" expression="$"/>
                    <arg expression="get-property('SYSTEM_DATE', 'yyyy-MM-dd HH:mm:ss')" type="STRING"/>
                </args>
            </payloadFactory>
            <log level="full" category="INFO" message="Post API Response with Extra Fields"/>
        </inSequence>
        <outSequence/>
        <faultSequence>
            <log level="full" category="ERROR" message="Error occurred in ERP Proxy Service"/>
            <!-- 可添加错误通知、重试等逻辑 -->
        </faultSequence>
    </target>
</proxy>

2. 其他实现方案

除了直接在Proxy Service的InSequence中串行调用API,还可以采用以下方案:

(1)抽离独立Sequence复用逻辑

将Get API调用、Post API调用、响应处理分别拆分为独立的Sequence,提高代码复用性和可维护性:

  • 创建CallGetApiSequence.xml处理Get API调用
  • 创建CallPostApiSequence.xml处理Post API调用和响应字段添加
  • 在Proxy Service的InSequence中通过<sequence key="CallGetApiSequence"/>引用

(2)使用Scheduled Task作为入口

若不需要Proxy Service的HTTP/HTTPS传输能力,可直接用WSO2的Scheduled Task mediator触发逻辑,无需依赖Proxy:

<?xml version="1.0" encoding="UTF-8"?>
<task name="ERPScheduledTask" class="org.apache.synapse.startup.tasks.MessageInjector" group="synapse.simple.quartz">
    <trigger interval="300"/> <!-- 每5分钟执行一次 -->
    <property name="injectTo" value="sequence"/>
    <property name="sequenceName" value="ERPTaskExecutionSequence"/>
    <property name="message">
        <text>{"trigger": "scheduled-task"}</text>
    </property>
</task>

然后在ERPTaskExecutionSequence中实现API调用和响应处理逻辑。

(3)异步解耦:Message Store + Processor

如果需要实现异步处理、失败重试或流量削峰,可使用Message Store和Processor:

  1. 调用Get API后,将结果存入Message Store(如ERPMessagesStore)
  2. 创建Message Processor监听Store,自动触发Post API调用和响应处理
  3. 适合高并发或对可靠性要求较高的场景

(4)使用复合Endpoint

若API调用逻辑复杂,可将多个API封装为复合Endpoint,通过<call>调用复合Endpoint简化InSequence代码。

内容的提问来源于stack exchange,提问作者ebad mahmood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:44:59