如何在WSO2 EI6.6.0中调用带JSON请求体的HTTP GET API
解决方案
1. 修改Axis2全局配置
WSO2 EI基于Axis2框架,默认的HTTP传输层会过滤GET请求的请求体,需要修改全局配置开启允许GET带请求体的功能:
打开EI_HOME/conf/axis2/axis2.xml,分别找到HTTP和HTTPS传输发送器的配置节点,添加允许参数:
HTTP传输发送器
找到以下节点:
<transportSender name="http" class="org.apache.synapse.transport.nhttp.HttpCoreNIOSender">
在节点内部新增参数:
<parameter name="AllowGetMethodWithPayload">true</parameter>
HTTPS传输发送器(若使用HTTPS调用下游)
找到以下节点:
<transportSender name="https" class="org.apache.synapse.transport.nhttp.HttpCoreNIOSender">
同样添加参数:
<parameter name="AllowGetMethodWithPayload">true</parameter>
修改完成后,重启WSO2 EI服务使配置生效。
2. 调整序列配置
在你的序列中补充必要属性,确保请求体被正确携带并发送:
- 添加
Content-Type传输头,明确请求体格式为JSON - 移除
NO_ENTITY_BODY属性(EI默认会为GET请求设置该属性,导致丢弃请求体)
调整后的完整序列代码:
<sequence name="moz-simo-billpay-general-process-request-seq" xmlns="http://ws.apache.org/ns/synapse"> <payloadFactory media-type="json"> <format> { "Document": { "ServiceReq": { "Hdr": { "MsgFctn": "$2", "PrtcolVrsn": "$3", "MsgUUID": "" }, "ReqData": $1 } } } </format> <args> <arg evaluator="xml" expression="$ctx:incomingPayload" literal="false" xmlns:ns="http://org.apache.synapse/xsd"/> <arg evaluator="xml" expression="$ctx:operationCode" literal="false" xmlns:ns="http://org.apache.synapse/xsd"/> <arg evaluator="xml" expression="$ctx:protocol" literal="false" xmlns:ns="http://org.apache.synapse/xsd"/> </args> </payloadFactory> <property expression="fn:concat($ctx:mozSimoBillpayUrl, '/BillPay/V2.0.1.0/Billers')" name="uri.var.mozSimoBillPayUrl" scope="default" type="STRING" xmlns:ns="http://org.apache.synapse/xsd"/> <property name="HTTP_METHOD" scope="axis2" type="STRING" value="GET"/> <!-- 明确请求体格式为JSON --> <property name="Content-Type" scope="transport" type="STRING" value="application/json"/> <!-- 移除默认的NO_ENTITY_BODY属性,确保请求体被发送 --> <property action="remove" name="NO_ENTITY_BODY" scope="axis2"/> <property action="remove" name="REST_URL_POSTFIX" scope="axis2"/> <property name="DISABLE_CHUNKING" scope="axis2" type="STRING" value="true"/> <property expression="concat('Bearer ',$ctx:bearerToken)" name="Authorization" scope="transport" xmlns:ns="http://org.apache.synapse/xsd"/> <call> <endpoint> <http uri-template="{uri.var.mozSimoBillPayUrl}"> <timeout> <duration>120000</duration> <responseAction>fault</responseAction> </timeout> <suspendOnFailure> <errorCodes>-1</errorCodes> <initialDuration>0</initialDuration> <progressionFactor>1.0</progressionFactor> <maximumDuration>0</maximumDuration> </suspendOnFailure> <markForSuspension> <errorCodes>-1</errorCodes> </markForSuspension> </http> </endpoint> </call> <log level="full"/> <property expression="json-eval($)" name="response" xmlns:ns="http://org.apache.synapse/xsd"/> </sequence>
关键说明
AllowGetMethodWithPayload:全局开启Axis2传输层对GET请求携带请求体的支持,这是基础配置。NO_ENTITY_BODY:EI默认会为GET请求设置该属性为true,主动移除该属性可强制传输层保留并发送请求体。Content-Type头:明确告知下游API请求体为JSON格式,避免因格式识别错误导致的返回异常。
内容的提问来源于stack exchange,提问作者Noman Khan
相关产品推荐
相关产品推荐

