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

SpringBoot REST PUT接口手动测试200,单元测试返回406排查

解决PUT API单元测试返回406的问题

首先,406状态码(Not Acceptable)的核心含义是:服务器无法返回符合客户端Accept请求头指定格式的响应。手动调用正常但测试失败,大概率是测试代码里的请求头和手动调用时不一致,以下是最常见的几个排查方向:

1. 检查测试代码的Accept请求头

手动调用API时(比如用Postman、curl),你的浏览器或工具可能默认发送了Accept: application/json这类头,明确告诉服务器你能接受JSON格式的响应。但单元测试框架(比如JUnit+MockMvc、pytest+requests)默认可能不会自动添加这个头,或者添加了错误的类型。

举个Java MockMvc的例子,你可能漏了指定接受JSON格式:

mockMvc.perform(put("/api/your-endpoint")
        .contentType(MediaType.APPLICATION_JSON)
        .content(requestBody)
        // 关键:显式声明接受JSON响应
        .accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk());

如果用Python的requests库,测试代码要显式配置请求头:

response = requests.put(
    url,
    json=request_body,
    headers={"Accept": "application/json"}
)

2. 确认Content-Type请求头是否正确

虽然手动调用正常,但也要确保测试代码里的Content-Type是application/json——有些测试框架在发送JSON时不会自动设置这个头,服务器可能无法正确解析请求体,进而导致后续响应格式匹配失败(比如服务器解析不了请求,返回了HTML格式的错误页,而你的测试要求接受JSON,就触发406)。

Node.js的supertest测试示例,要同时设置两个关键头:

request(app)
  .put('/api/your-endpoint')
  .set('Content-Type', 'application/json')
  .set('Accept', 'application/json')
  .send(requestBody)
  .expect(200);

3. 检查服务器端的内容协商配置

有些后端框架(比如Spring Boot、Express)会有内容协商的配置,如果服务器只允许特定的Accept类型,而测试请求的Accept头不在允许列表里,就会返回406。

比如Spring Boot里如果开启了spring.mvc.contentnegotiation.favor-path-extension=true,但你的测试请求没带.json后缀,也没指定Accept头,就可能触发406。这种情况要么在测试里补全正确的头,要么调整服务器配置关闭不必要的内容协商限制。

4. 排查测试框架的默认行为差异

不同测试框架对请求头的默认处理存在差异:

  • 比如MockMvc默认不会发送任何Accept头,而浏览器会发送包含多种类型的Accept头(比如text/html,application/xhtml+xml,application/json;q=0.9),服务器可能在没有Accept头时默认返回JSON,但如果测试框架发送了不支持的Accept类型,就会失败。
  • 有些工具会自动序列化JSON请求体,但测试代码可能没正确处理序列化,导致服务器解析失败,间接引发406(比如服务器返回HTML错误页,而测试要求Accept JSON)。

最后,最直接的定位方法是对比手动调用和测试请求的完整请求头——可以在服务器端打印所有请求头,或者用抓包工具(比如Wireshark)抓下两次请求的头信息,差异点通常就是问题所在。

内容的提问来源于stack exchange,提问作者Gregor Sklorz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:12:59