如何在WSO2侧解决204 No Content响应解析异常问题?
问题场景
- 某微服务返回204状态码时,WSO2无法解析响应,返回500 Internal Server Error;将状态码改为404后,WSO2可正常解析且无报错。需从WSO2侧解决该204状态码兼容问题。
错误日志
TargetHandler ERROR_CODE = 101506, STATE_DESCRIPTION = Exception occurred after Server written the request headers and the request body to the backend,
报错信息:
ERROR - TargetHandler HTTP protocol violation : Not a valid protocol version: {"status":"NO_CONTENT","message":"Job data not found","code":1107}HTTP/1.1 204 No Content For
rg.apache.synapse.transport.http.conn.LoggingNHttpClientConnection$LoggingNHttpMessageParser.parse(LoggingNHttpClientConnection.java:404) ~[synapse-nhttp-transport_2.1.7.wso2v183.jar:?]
原因分析
错误日志明确显示为HTTP协议违规:微服务返回204状态码时,附带了响应体内容({"status":"NO_CONTENT","message":"Job data not found","code":1107})。根据HTTP规范,204 No Content响应不应包含任何响应体,WSO2的HTTP解析器严格遵循规范,因此将该情况判定为协议违规,触发500错误。
解决方法(WSO2侧)
方法1:修改HTTP传输适配器配置
编辑WSO2安装目录下的<WSO2_HOME>/repository/conf/axis2/axis2.xml文件,调整HTTP传输的发送器和监听器配置,允许204响应携带内容:
<!-- 修改HTTP传输发送器 --> <transportSender name="http" class="org.apache.synapse.transport.http.conn.HttpCoreNIOSender"> <!-- 保留原有参数,新增以下配置 --> <parameter name="allow204WithBody">true</parameter> </transportSender> <!-- 修改HTTP传输监听器 --> <transportReceiver name="http" class="org.apache.synapse.transport.http.conn.HttpCoreNIOListener"> <!-- 保留原有参数,新增以下配置 --> <parameter name="allow204WithBody">true</parameter> </transportReceiver>
保存配置后重启WSO2服务,即可让解析器兼容带响应体的204状态码。
方法2:通过中介流清除204响应体
在API的中介序列中添加处理逻辑,当后端返回204状态码时,自动清除响应体,符合HTTP规范:
<sequence name="Handle204Response" xmlns="http://ws.apache.org/ns/synapse"> <filter source="$axis2:HTTP_SC" regex="204"> <then> <!-- 设置无实体体标识 --> <property name="NO_ENTITY_BODY" value="true" scope="axis2"/> <!-- 清空响应体 --> <payloadFactory media-type="json"> <format/> <args/> </payloadFactory> </then> </filter> </sequence>
将该序列添加到对应API的outSequence中,确保响应返回客户端前完成处理。
内容的提问来源于stack exchange,提问作者CKR

