使用CloseableHttpClient发起请求时遇Content-Length已存在错误的解决咨询
解决CloseableHttpClient中"Content-Length header already present"错误
这个问题很常见,原因其实很直接:Apache HttpClient 4.x版本会自动根据请求体的内容计算并添加Content-Length请求头,而你手动调用httpPost.setHeader("Content-Length", "0");又设置了一遍,导致头信息重复,触发了这个错误。
下面给你两种解决方案,优先推荐第一种:
方案1:移除手动设置的Content-Length头
这是最简洁也最可靠的做法,直接删掉代码里的httpPost.setHeader("Content-Length", "0");这一行。
当你的请求没有请求体时,HttpClient会自动处理Content-Length(设置为0)或者使用Transfer-Encoding: chunked,完全不需要你手动干预。修改后的完整代码如下:
package com.dotcomculture.arbbot; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.CloseableHttpResponse; public class ArbBot { public static void main(String [ ] args)throws Exception{ System.out.println("I am in main" ); CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("https://api.sandbox.gemini.com"); httpPost.setHeader("Content-type", "text/plain"); // 移除了手动设置的Content-Length头 httpPost.setHeader("X-GEMINI-APIKEY", "API KEY HERE"); httpPost.setHeader("X-GEMINI-PAYLOAD", "Payload here"); httpPost.setHeader("X-GEMINI-SIGNATURE", "Signature here"); // 额外提示:Cache-Control设置为"0"不符合规范,建议改成合法值比如"no-cache" httpPost.setHeader("Cache-Control", "no-cache"); CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpPost); int statusCode = closeableHttpResponse.getStatusLine().getStatusCode(); System.out.println("Status Code : " +statusCode ); } }
方案2:关闭Content-Length校验(特殊场景用)
如果你确实有特殊需求必须手动设置Content-Length,可以通过修改HttpClient的配置来关闭重复头的校验。创建HttpClient时使用自定义构建器:
CloseableHttpClient httpClient = HttpClients.custom() .disableContentLengthValidation() .build();
不过除非你明确知道自己在做什么,否则不推荐这种方式——自动处理Content-Length能避免很多因请求体变化导致的长度不匹配问题。
另外提个小细节:你的POM里单独引入了httpcore依赖,其实httpclient已经包含了对应的httpcore依赖,不需要重复引入,可以把这部分删掉,避免版本不一致的潜在问题。
内容的提问来源于stack exchange,提问作者Caulinez
相关产品推荐
相关产品推荐

