尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Spring AI 对接 vLLM 的 DeepSeek 报 400 避坑指南:请求体为何会凭空消失

Spring AI 对接 vLLM 的 DeepSeek 报 400 避坑指南:请求体为何会凭空消失 Spring AI 对接 vLLM 的 DeepSeek 报 400 避坑指南请求体为何会凭空消失【免费下载链接】spring-aiAn Application Framework for AI Engineering项目地址: https://gitcode.com/GitHub_Trending/spr/spring-ai用 Spring AI 的 OpenAiChatModel 对接 vLLM 部署的 DeepSeek 模型base-url、api-key、model 三项配置全对curl 一发就通框架调用却稳定报 HTTP 400、提示 Field required。这篇避坑指南从这条报错倒查起讲清分块传输编码如何把请求体弄丢以及怎么更换 HTTP 客户端绕开这个 400。配置全对却 400curl 能通框架调不通先看现象。用 Spring AI 的 spring-ai-openai 模块 中的 OpenAiChatModel 打向 vLLM 的 chat/completions 接口消息内容怎么改都没用返回始终是同一条 400400 - {object:error,message:[{type: missing, loc: (body,), msg: Field required, input: None}],type:BadRequestError,param:null,code:400}⚠️ 关键是input: None这不是某个字段没填而是服务端压根没收到请求体——它看到的 body 是空的。换成 curl 发同样的 JSON同一个接口立刻返回 200。所以问题不在参数而在请求是怎么送出去的。顺着报错倒查分块传输编码是隐形杀手HTTP 请求体有两种常见寄法。一种是先写 Content-Length总字节数服务端照单全收另一种是分块传输编码chunked transfer encoding一种不声明总长度、边发边补的请求体格式——就像把文档拆成几页分别寄出不提前说总页数每寄一页附一个标记最后一块标记没有了。Spring 默认的 JDK HttpClient 在请求体以流式方式写出、长度未知时就会走分块这条路。而 vLLM 的解析链对这种没有 Content-Length 的请求体处理不完整Pydantic 校验时拿到的 body 是 None于是报出上面那条 400。curl 为什么没事它发的是定长 JSON总带 Content-Length服务端一次读完根本不触发分块路径。这就是直发 HTTP 没问题、走框架却失败的完整解释差别不在 URL、不在 Header而在请求体的传输方式。如何更换 HTTP 客户端绕开 400 报错 思路很简单换一个会先把请求体缓冲下来、算出总长度再发送的客户端。Jetty 是现成答案两步走引入 Jetty 客户端依赖reactive 版供 WebClient 使用dependency groupIdorg.eclipse.jetty/groupId artifactIdjetty-client/artifactId /dependency dependency groupIdorg.eclipse.jetty/groupId artifactIdjetty-reactive-httpclient/artifactId /dependency构造 OpenAiApi 时把同步调用用的 RestClient 和流式调用用的 WebClient 底层传输都换成 JettyOpenAiApi openAiApi OpenAiApi.builder() .baseUrl(chatConfig.getBaseUrl()) .apiKey(chatConfig.getApiKey()) .restClientBuilder(RestClient.builder() .requestFactory(new JettyClientHttpRequestFactory())) .webClientBuilder(WebClient.builder() .clientConnector(new JettyClientHttpConnector())) .build();改完后请求体带 Content-Length 发出vLLM 正常解析400 消失。完整调用链可参考 OpenAiChatModel 源码。对接 OpenAI 兼容服务前先 curl 验证一遍把配置问题和协议问题分开再遇到 body Field required 这类 400第一反应怀疑分块传输而不是反复改参数持续关注 vLLM 是否补齐对 chunked 请求体的支持修好后默认客户端即可换回。【免费下载链接】spring-aiAn Application Framework for AI Engineering项目地址: https://gitcode.com/GitHub_Trending/spr/spring-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表