如何在Feign Client中拒绝XML格式的请求
解决仅接受application/json请求体的问题
一、服务端层面:拒绝非JSON请求
如果你的系统作为服务端,需要拦截外部客户端发送的XML等非JSON格式请求,可通过以下方式实现:
1. 校验Content-Type请求头
在服务端接口上明确指定仅接受application/json类型的请求:
- 若使用JAX-RS规范,添加
@Consumes(MediaType.APPLICATION_JSON)注解; - 若使用Spring MVC,在
@PostMapping中指定consumes属性。
当请求的Content-Type不符合要求时,服务端会直接返回415 Unsupported Media Type错误。示例(Spring MVC):
@PostMapping(value = "/notifications", consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<?> handleNotifications(@RequestBody SpNotifications requestBody) { // 业务处理逻辑 }
2. 校验请求体实际格式
若存在客户端伪造Content-Type头但发送XML的情况,可添加全局拦截器/过滤器,对请求体进行JSON格式校验:
- 读取请求体内容,尝试用JSON解析器(如Jackson)解析;
- 若解析失败,直接返回
400 Bad Request错误; - 注意处理请求体流可重复读取的问题(例如使用
ContentCachingRequestWrapper包装请求)。
二、Feign客户端层面:确保只发送JSON请求体
如果你的需求是让自身Feign客户端仅发送JSON格式请求体,避免误发XML,可做以下配置:
1. 指定JSON编码器
构建Feign客户端时,明确使用Jackson编码器(而非XML编码器),确保请求体被序列化为JSON:
ExampleApi exampleApi = Feign.builder() .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .target(ExampleApi.class, "http://your-service-base-url");
2. 清理冗余注解
你的接口中重复声明了Accept: application/json头,保留一处即可,简化代码:
@Headers({"Accept: application/json"}) public interface ExampleApi { @RequestLine("POST /notifications") @Headers({"Authorization: Bearer {token}", "X-Flow-ID: {xFlowId}", "Content-Type: application/json"}) Response postExample(SpNotifications requestBody, @Param("token") String token, @Param("xFlowId") String xFlowId); }
关键提示
- 仅添加
Content-Type头无法保证请求体格式正确,必须配合正确的编码器配置,从根源上避免发送XML; - 服务端校验是核心防线,即使客户端发送违规请求,也能直接拦截,避免无效请求进入业务逻辑。
内容的提问来源于stack exchange,提问作者Tonyukuk
相关产品推荐
相关产品推荐

