我正在尝试使用Apache Components(4.3) - http://hc.apache.org/httpcomponents-client-4.3.x/tutorial/html/fluent.html的示例构建一个http POST。不幸的是,我收到的错误是我无法找到解决方法。
之前我使用过前HttpClient
- 所以这是我第一次使用组件。
以下是代码片段:
String address = "http://1.1.1.1/services/postPositions.php";
String response = Request.Post(address)
.bodyString("Important stuff", ContentType.DEFAULT_TEXT)
.execute().returnContent().asString();
System.out.println(response);
当我运行该代码时,我得到一个例外:
Exception in thread "main" java.lang.IllegalStateException: POST request cannot enclose an entity
at org.apache.http.client.fluent.Request.body(Request.java:299)
at org.apache.http.client.fluent.Request.bodyString(Request.java:331)
at PostJson.main(PostJson.java:143)
我也试过构建一个表单元素并使用bodyForm()
方法 - 但是我得到了同样的错误。
答案 0 :(得分:6)
我遇到了同样的问题,修复方法是使用Apache Client 4.3.1。
似乎请求已更改:
HttpRequestBase
InternalHttpRequest
答案 1 :(得分:1)
我做了一些挖掘,但看不出它是如何工作的(你可能发现了一个错误)。
错误源于最新主干版本中的line 300 in Request。进行检查以查看this.request instanceof HttpEntityEnclosingRequest
是否为真,因为this.request
始终在第130行的Request构造函数中设置为InternalHttpRequest
的实例,InternalHttpRequest
没有实现org.apache.http.HttpEntityEnclosingRequest
`。
答案 2 :(得分:1)
为了完整起见,我将发布不使用Fluent API的方法。即使它没有回答“如何使用流畅的Apache组件”这个问题,我认为值得指出的是,以下最简单的解决方案适用于有错误的版本:
public void createAndExecuteRequest() throws ClientProtocolException, IOException {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(host);
httppost.setEntity(new StringEntity("Payload goes here"));
try (CloseableHttpResponse response = httpclient.execute(httppost)) {
// do something with response
}
}
就我而言,降级不是一种选择,所以这是最好的解决方案。