使用java.net.http.HttpClient调用Rest API时如何保留请求头大小写
如何在Java HttpClient中保留请求头的大小写?
Java 11+ 自带的HttpClient默认会根据使用的HTTP协议版本处理请求头名称:
- 若使用HTTP/2协议(默认自动协商),客户端会强制将所有请求头名转为小写,符合HTTP/2规范要求
- 若使用HTTP/1.1协议,客户端会保留你设置的请求头名大小写
你的问题中请求头userID被转为userid,大概率是因为客户端自动使用了HTTP/2协议。要保留请求头大小写,只需强制客户端使用HTTP/1.1协议发送请求即可。
修改后的完整代码
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://example.com/xyz")) .header("userID", "test_user") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n\t\"data\": \"test\",\n\t\"sign\": \"test\"\n}")) .build(); HttpResponse<String> response = null; try { // 强制使用HTTP/1.1协议构建HttpClient HttpClient httpClient = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_1_1) .build(); response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); } catch (IOException e) { throw new RuntimeException(e); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 恢复线程中断状态 throw new RuntimeException(e); } System.out.println(response.body());
补充说明
如果服务端必须使用HTTP/2协议,那么无法在客户端保留请求头大小写——因为HTTP/2规范明确要求头名必须是小写形式,此时需要联系服务端修改大小写敏感的校验逻辑,使其符合HTTP协议规范。
内容的提问来源于stack exchange,提问作者Yusuf Kapasi
相关产品推荐
相关产品推荐

