WSO2 3.2.0使用Call Mediator调用Magento 2.4.1 API报错如何解决
问题根因
你遇到的二次请求问题是WSO2 APIM的默认请求处理流程导致的:WSO2 APIM默认的请求流转逻辑为「执行自定义in序列 -> 转发请求到配置的生产端点 -> 执行out序列 -> 返回响应给客户端」。你在in序列中使用的call mediator只是额外发起了一次Magento token请求,并不会终止默认的转发流程,因此在你的自定义序列执行完成后,网关还会发起第二次请求到你配置的Magento生产端点,此时请求体已经不是你用payloadFactory构造的用户名密码内容,所以Magento返回参数缺失错误,该错误响应最终被返回给客户端。
你之前使用To头配置可以正常返回,是因为该方式直接修改了默认转发的目标地址,仅会发起一次请求,没有二次转发的问题,但这种方案无法支持多步服务链调用。
解决方案
只需要在你的自定义序列所有业务逻辑执行完成后,添加respond mediator终止后续的默认转发流程,直接将当前消息体作为响应返回给客户端即可。
修改后的序列示例
<?xml version="1.0" encoding="UTF-8"?> <sequence name="service_chain_request_magento" trace="disable" xmlns="http://ws.apache.org/ns/synapse"> <property action="remove" name="REST_URL_POSTFIX" scope="axis2"/> <property name="FORCE_HTTP_1.0" scope="axis2" type="STRING" value="true"/> <property name="DISABLE_CHUNKING" scope="axis2" type="STRING" value="true"/> <payloadFactory media-type="json"> <format>{"username":"<username>","password":"<pwd>"}</format> <args/> </payloadFactory> <property name="messageType" value="application/json" scope="axis2"/> <call blocking="true"> <endpoint> <http method="post" uri-template="http://<magento_ip>/index.php/rest/all/V1/integration/admin/token"> <timeout> <duration>6000</duration> <responseAction>fault</responseAction> </timeout> </http> </endpoint> </call> <enrich> <source type="body" clone="true"/> <target type="property" action="child" property="body_of_first_call"/> </enrich> <log level="full"/> <!-- 新增配置:设置响应状态码为200 --> <property name="HTTP_SC" scope="axis2" value="200" type="STRING"/> <!-- 新增配置:终止后续默认转发,直接返回当前响应给客户端 --> <respond/> </sequence>
服务链扩展说明
如果你需要追加更多call mediator实现多步服务调用,不需要修改现有逻辑,只需在respond mediator之前添加后续的调用逻辑即可:
- 可以从
body_of_first_call属性中提取已经拿到的token - 用payloadFactory构造下一个接口的请求参数
- 新增call mediator调用Magento其他业务接口
- 所有调用完成并构造好最终返回给客户端的响应体后,再执行
respond终止流程即可。
内容的提问来源于stack exchange,提问作者hubfix
相关产品推荐
相关产品推荐

