Как использовать fluent компонентов Apache

Я пытаюсь создать HTTP-сообщение, используя примеры компонентов Apache(4.3) - 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() способ - но я получаю ту же ошибку.

3 ответов


у меня была та же проблема, исправление заключается в использовании Apache Client 4.3.1, который работает.

Кажется, что запрос был изменен:

  • в 4.3.1 они используют public HttpRequestBase
  • в последней версии они используют пакет protected InternalHttpRequest

Я немного копал и не вижу, как это может работать (возможно, вы нашли ошибку).

ошибка связана с строка 300 в запросе в последнюю версию. Там делается проверка, чтобы увидеть, если this.request instanceof HttpEntityEnclosingRequest но это никогда не было правдой, потому что this.request всегда устанавливается в экземпляр InternalHttpRequest в конструкторе запросов в строке 130 и InternalHttpRequest не выполнять org.apache.http.HttpEntityEnclosingRequest`.


для полноты я собираюсь опубликовать способ сделать это без использования 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
    }
}

в моем случае понижение не было вариантом, поэтому это было лучшее решение.