如何使用 Java Apache HttpClient 正确发出 POST 请求?

how to properly make a POST request using Java Apache HttpClient?

我正在尝试使用 Apache HttpClient5 在 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 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 = new HttpPost(uri);
httpPost.addHeader(new BasicHeader("x-api-user",getApiUser()));
httpPost.addHeader(new BasicHeader("x-api-key", getApiKey()));
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
logger.info(httpResponse.toString());
return httpResponse.getCode();

我在 运行 Java 调用时得到的输出是

411 Length Required HTTP/1.0

我确定我没有正确构建 POST 调用,应该如何完成?我试过指定 Content-Type 但没有效果。尝试在代码中设置 Content-Length 会导致编译错误(据我了解,这是由 HttpClient5 在幕后处理的)。 我所有使用 HttpClient5 的 GET 请求都工作正常。

A POST 总是有有效负载(内容)。 POST 没有内容是不正常的,所以你确定你没有忘记什么?

你需要调用setEntity()来设置有效载荷,即使它是空的,因为它是设置Content-Length头的实体。

例如你可以调用 httpPost.setEntity(new StringEntity("")),它设置 Content-Type: text/plainContent-Length: 0.