如何使用流畅的Apache组件

时间:2014-02-28 12:32:25

标签: java apache-httpclient-4.x

我正在尝试使用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()方法 - 但是我得到了同样的错误。

3 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,修复方法是使用Apache Client 4.3.1。

似乎请求已更改:

  • 在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
    }
}

就我而言,降级不是一种选择,所以这是最好的解决方案。