JDK HttpClient 遇上 FastAPI:一次 POST 请求体消失问题的排查
同一个 POST 请求,用 fetch、PowerShell 或 curl 调用都能成功,通过 JDK HttpClient 发出时却得到 400。换成 FastAPI 接口后,响应变成 422,服务端声称请求体不存在。 问题不在 JSON,而在 HTTP 协议协商。 现象 后端使用 Spring RestTemplate: new RestTemplate(new JdkClientHttpRequestFactory()); 两组对照实验得到相同结论: 客户端 结果 Node fetch 200 OK PowerShell Invoke-RestMethod 200 OK 默认 JDK HttpClient 400 Invalid HTTP request received. 或 422 Body missing 强制 JDK HTTP/1.1 200 OK 唯一关键变量是 HTTP 版本。 根因 JdkClientHttpRequestFactory 默认创建 HttpClient.newHttpClient()。JDK HttpClient 偏好 HTTP/2;访问明文 http:// 地址时,会尝试 h2c Upgrade: Connection: Upgrade, HTTP2-Settings Upgrade: h2c HTTP2-Settings: ... User-Agent: Java-http-client/21 部分 Python HTTP parser 不能正确处理这个请求。它们可能直接返回 400,也可能让应用层看到一个没有 Body 的 POST,最终由 FastAPI 返回 422。 ...