如何在WSO2 API Manager 3.2.0全局配置Content Type校验返回415状态码
在WSO2 API Manager 3.2.0中全局配置Content-Type校验返回415状态码
要实现REST API所有资源的全局Content-Type校验(仅允许application/json,否则返回415),可以通过自定义中介序列在网关层拦截不符合要求的请求,具体步骤如下:
1. 创建Content-Type校验中介序列
登录WSO2 APIM管理控制台,进入Main > Manage > Mediation > Sequences,创建一个新的入站序列,添加以下XML配置:
<sequence xmlns="http://ws.apache.org/ns/synapse" name="GlobalContentTypeValidation"> <!-- 获取请求的Content-Type头 --> <property name="REQUEST_CONTENT_TYPE" expression="get-property('transport','Content-Type')"/> <!-- 校验Content-Type是否为application/json(忽略大小写,支持带charset的情况如application/json;charset=utf-8) --> <filter source="$ctx:REQUEST_CONTENT_TYPE" regex="application/json.*" regexFlags="i"> <then> <!-- 校验通过,继续请求流程 --> <log level="custom"> <property name="ValidationResult" value="Content-Type is valid (application/json)"/> </log> </then> <else> <!-- 校验失败,返回415状态码及错误信息 --> <payloadFactory media-type="json"> <format>{"error_code": "415", "error_message": "Unsupported Media Type. Only application/json is allowed."}</format> <args/> </payloadFactory> <property name="HTTP_SC" value="415" scope="axis2"/> <respond/> </else> </filter> </sequence>
2. 全局应用该中介序列
方式一:应用到所有API
- 进入Main > Manage > API Manager > Policies > Mediation Policies
- 创建新的全局入站策略,关联刚才创建的
GlobalContentTypeValidation序列 - 将该策略设置为全局默认,或批量应用到所有已发布的API
方式二:应用到单个API
进入目标API的编辑页面,切换到Runtime Configurations标签,在Inbound Mediation下拉菜单中选择GlobalContentTypeValidation序列并保存发布。
3. 验证效果
执行你提供的测试请求:
curl --location --request POST 'https://10.10.10.24:8243/pri/general/v1/service1' \ --data ''
此时网关会直接返回415 Unsupported Media Type状态码及自定义错误信息,而非之前的500内部错误。
说明
之前出现500错误是因为未校验的请求被转发到后端服务,后端无法处理无Content-Type或非JSON格式的请求导致内部异常。通过网关层提前拦截校验,既保证了返回正确的HTTP状态码,也避免了无效请求对后端服务的影响。
内容的提问来源于stack exchange,提问作者Ali farahzadi
相关产品推荐
相关产品推荐

