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

Java HttpClient发送带请求体的POST请求返回404如何解决

问题原因

你的请求构造代码存在两个核心错误:

  • 同时调用了.GET()和.POST()两个互斥的请求方法配置。Java HttpClient的构造器中,后设置的请求方法会覆盖之前的配置,但先调用GET方法会触发Builder内部对「无请求体」的默认校验逻辑,和后续配置的POST请求体产生冲突,导致最终发出的请求格式不符合预期。
  • HTTP协议规范中GET方法不定义请求体语义,绝大多数Web服务端框架(包括Node.js生态的Express、Koa等)遇到带请求体的GET请求时,会直接跳过对应路由的匹配逻辑,直接返回404状态码。
修复方案

直接移除多余的.GET()调用即可,POST请求不需要提前设置GET方法。修正后的可运行代码如下:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class HttpPostDemo {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .header("Content-Type", "text/plain;charset=UTF-8")
                .uri(URI.create("http://localhost:3000"))
                // 直接配置POST方法和请求体,不需要提前调用.GET()
                .POST(HttpRequest.BodyPublishers.ofString("Hello", StandardCharsets.UTF_8))
                .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));

        System.out.println("status:" + response.statusCode());
        System.out.println("response:" + response.body());
    }
}
排查补充

如果修正代码后仍然返回404,请检查你的Node.js服务端配置:

  • 确认/路径确实配置了POST方法的处理逻辑,而不是仅配置了GET方法的处理器。以Express框架为例,需要写app.post('/', handler)才能接收根路径的POST请求,仅配置app.get('/', handler)时所有POST请求都会返回404。
  • 确认服务端没有对请求头做额外拦截校验,比如要求携带特定User-Agent、鉴权头才会匹配路由。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:24:14