如何使用 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/plain
和 Content-Length: 0
.
我正在尝试使用 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/plain
和 Content-Length: 0
.