Java发起HTTP请求报HTTP/1.1 header parser received no bytes如何解决
问题排查与修复方案
该错误本质是客户端发送请求后,服务端直接断开了连接,没有返回任何HTTP响应头或内容。你可以按照以下步骤排查修改:
1. 先确认服务端状态
- 首先检查本地8000端口的服务是否正常运行:可以用
curl http://localhost:8000/get -H "code: 测试值"手动发起请求,确认是否有正常返回 - 确认服务端是否修改了配置:比如是否切换为HTTPS协议、端口变更、接口路径调整、新增了鉴权规则直接拦截断连
- 确认服务端是否会返回204(无内容)状态码的响应,Java 11早期版本的HttpClient对204响应的处理存在已知bug,会触发该报错
2. 代码层面修改点
2.1 新增HttpClient超时配置
原代码没有配置超时,连接挂起后被服务端主动断连很容易触发该报错,修改初始化逻辑:
// 需导入java.time.Duration包 HttpClient client = HttpClient.newBuilder() // 连接超时 .connectTimeout(Duration.ofSeconds(10)) // 全流程请求响应超时 .requestTimeout(Duration.ofSeconds(30)) .build();
2.2 显式指定HTTP协议版本
HttpClient默认会优先尝试HTTP/2协议,如果服务端不支持HTTP/2,协商失败的部分场景会触发该报错,可强制指定用HTTP/1.1:
HttpRequest request = HttpRequest.newBuilder() .uri(new URI("http://localhost:8000/get")) .header("code", Integer.toString(requestcode)) // 强制使用HTTP 1.1协议 .version(HttpClient.Version.HTTP_1_1) .GET() .build();
2.3 新增异常重试逻辑
针对偶发的服务端抖动导致的断连,增加重试逻辑提升稳定性:
public static String request(int requestcode) throws URISyntaxException, IOException, InterruptedException{ HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .requestTimeout(Duration.ofSeconds(30)) .build(); HttpRequest request = HttpRequest.newBuilder() .uri(new URI("http://localhost:8000/get")) .header("code", Integer.toString(requestcode)) .version(HttpClient.Version.HTTP_1_1) .GET() .build(); // 最多重试3次 int retryCount = 3; while (retryCount > 0) { try { HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); return response.body(); } catch (IOException e) { retryCount--; if (retryCount == 0) { throw e; } // 重试间隔1秒 Thread.sleep(1000); } } return null; }
3. 其他排查方向
- 如果开启了代理、VPN,先关闭再测试,本地回环请求走代理容易出现连接异常
- 检查防火墙规则是否拦截了Java进程访问8000端口的请求
- 如果你使用的是Java 11早期版本,建议升级到Java 11.0.14+或者更高的LTS版本,早期版本的HttpClient存在多个连接处理相关的已知bug
内容的提问来源于stack exchange,提问作者MichaPehlivan
相关产品推荐
相关产品推荐

