Required request body is missing、JSON token 错误和媒体类型不支持,不是同一个问题。先确认请求有没有命中接口,再看实际参数与请求体,最后检查转换器,才知道应该改哪一层。

按响应与异常定位

现象优先核对
404最终 URL、上下文路径、网关转发和处理器是否命中
405路径存在但 HTTP 方法不受支持
400 或缺参数异常参数名、类型、必填项、绑定和校验结果
Required request body is missing实际有没有可读请求体,是否已被上游消费
JSON Unrecognized token原始字节是否为合法 JSON,而非表单字符串
415 或媒体类型异常consumes、Content-Type、目标类型和消息转换器

状态可能被网关或异常处理器转换,不能只凭 400 就认定是 GET/POST 错,也不能把响应尾部的 null 当作根因。HTTP 方法与状态语义

JSON 请求要让三件事配套

jQuery 中 JSON.stringify 负责序列化,contentType 声明发送的类型,dataType 主要描述预期响应,职责不同:

$.ajax({
  url: "/examples/name",
  type: "POST",
  contentType: "application/json;charset=UTF-8",
  dataType: "json",
  processData: false,
  data: JSON.stringify({ name: "demo" })
});

在已接入 JSON 消息转换器的 Spring MVC 项目,可用下面的接收结构:

import java.util.Collections;
import java.util.Map;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class NameExampleController {
    public static class NameInput {
        private String name;
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    }

    @PostMapping(value = "/examples/name", consumes = "application/json",
                 produces = "application/json")
    public Map<String, String> name(@RequestBody NameInput input) {
        return Collections.singletonMap("name", input.getName());
    }
}

这是请求契约示例,没有业务保存或必填校验;约束与错误返回应按接口另加。@RequestBody 通过 HttpMessageConverter 读取,不是只能接 JSON。Spring 5 请求体转换

若异常已经明确写着 application/json 不被支持,再设一次相同 Content-Type 不会解决问题。应查转换器、目标 Java 类型、请求映射及依赖,而不是照抄旧短稿的一行建议。

GET 查询使用请求参数

$.ajax({
  url: "/search",
  type: "GET",
  data: { id: 1, name: "demo" }
});

jQuery 按设置把对象编码到查询串,常见形式是 /search?id=1&name=demo。不要把 JSON.stringify 后的整段 JSON 误当成普通 name=value 参数。jQuery Ajax 参数

“GET 不支持 @RequestBody”过于绝对,但 GET 内容没有通用定义的语义,客户端和中间层可能拒绝,普通查询不应依赖 GET body。POST 响应也并非协议层绝对不可缓存,还要看响应元数据与实现,不能把请求方法当唯一缓存开关。RFC 9110 GET/POST

Postman 和微服务也看实际发出的内容

JSON 接口在 Postman 中常用 Body 的 raw/JSON;表单、文件、文本接口则应使用各自契约。手工覆盖 Content-Type 时,检查是否与真实 body 及自动生成的头冲突。

旧记录还遇到 Angular 缺 ids、RestTemplate 路径错误和方法不符。可复用的是保存实际 method、URL、头、脱敏 body、控制器签名及服务端根因异常。先确定哪一跳生成响应,再修改对应层;单看前端“请求失败”无法区分这些问题。