You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:57:28