如何使用 Fluent 的 Apache 组件

2022-09-03 15:32:21

我正在尝试使用Apache组件(4.3)的示例构建http POST - http://hc.apache.org/httpcomponents-client-4.3.x/tutorial/html/fluent.html。不幸的是,我收到一个错误,我无法找出解决方法。

我以前使用过前者 - 所以这是我第一次使用组件。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()


答案 1

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

请求似乎已更改:

  • 在4.3.1中,他们使用公共HttpRequestBase
  • 在最新版本中,他们使用受保护的软件包InternalHttpRequest

答案 2

为了完整起见,我将发布不使用 Fluent API 的方法。即使它没有回答“如何使用 Fluent 的 Apache 组件”的问题,我认为值得指出的是,下面最简单的情况,解决方案适用于有 bug 的版本:

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

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


推荐