如何使用JavaApacheHttpClient正确地发出POST请求?

如何使用JavaApacheHttpClient正确地发出POST请求?,java,apache-commons-httpclient,Java,Apache Commons Httpclient,我试图在使用ApacheHttpClient5的Java程序中使用web API 使用带有curl的简单请求: curl -X POST -H "x-api-user: d904bd62-da08-416b-a816-ba797c9ee265" -H "x-api-key: xxxxxxxxxxx" https://habitica.com/api/v3/user/class/cast/valorousPresence 我得到了预期的反应和效果 使用我的

我试图在使用ApacheHttpClient5的Java程序中使用web API

使用带有
curl
的简单请求:

curl -X POST -H "x-api-user: d904bd62-da08-416b-a816-ba797c9ee265" -H "x-api-key: xxxxxxxxxxx" https://habitica.com/api/v3/user/class/cast/valorousPresence
我得到了预期的反应和效果

使用我的Java代码:

URI=new-URIBuilder()
.setScheme(“https”)
.setHost(“habitica.com”)
.setPath(“/api/v3/user/class/cast/valorousPresence”)
.build();
Logger Logger=LoggerFactory.getLogger(MyClass.class);
CloseableHttpClient httpClient=HttpClientBuilder.create().build();
HttpPost HttpPost=新的HttpPost(uri);
addHeader(新的BasicHeader(“x-api-user”,getApiUser());
addHeader(新的BasicHeader(“x-api-key”,getApiKey());
CloseableHttpResponse httpResponse=httpClient.execute(httpPost);
logger.info(httpResponse.toString());
返回httpResponse.getCode();
运行Java调用时得到的输出是

411 Length Required HTTP/1.0
我肯定我没有正确构造POST调用,应该如何做?我尝试过指定内容类型,但没有效果。试图在代码中设置内容长度会导致编译错误(据我所知,这是由HttpClient5在幕后处理的)。
所有使用HttpClient5的GET请求都可以正常工作。

A
POST
始终具有有效负载(内容)。没有内容的
帖子是不寻常的,所以你确定你没有忘记什么吗

您需要调用
setEntity()
来设置有效负载,即使它是空的,因为正是该实体设置了
内容长度
标题


例如,您可以调用
httpPost.setEntity(new StringEntity(“”)
,它设置
内容类型:text/plain
内容长度:0
A
POST
始终具有有效负载(内容)。没有内容的
帖子是不寻常的,所以你确定你没有忘记什么吗

您需要调用
setEntity()
来设置有效负载,即使它是空的,因为正是该实体设置了
内容长度
标题


例如,您可以调用
httpPost.setEntity(new StringEntity(“”)
,它设置
内容类型:text/plain
内容长度:0

,这与客户端无关。如果没有
Content-Length
头,接收HTTP消息的服务器将不接受该消息。请参阅更多信息。
POST
始终具有有效负载(内容)。没有内容的
帖子是不寻常的,所以你确定你没有忘记什么吗?您需要调用
setEntity()
来设置有效负载,即使它是空的,因为设置内容长度的是实体。例如,您可以调用
httpPost.setEntity(new StringEntity(“”)
,它设置
内容类型:text/plain
内容长度:0
@Andreas谢谢,这很有效。如果你想把它作为一个答案,我会接受的。这与客户无关。如果没有
Content-Length
头,接收HTTP消息的服务器将不接受该消息。请参阅更多信息。
POST
始终具有有效负载(内容)。没有内容的
帖子是不寻常的,所以你确定你没有忘记什么吗?您需要调用
setEntity()
来设置有效负载,即使它是空的,因为设置内容长度的是实体。例如,您可以调用
httpPost.setEntity(new StringEntity(“”)
,它设置
内容类型:text/plain
内容长度:0
@Andreas谢谢,这很有效。如果你想加上它作为答案,我会接受的。