Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Для полноты я собираюсь опубликовать способ сделать это, не используя Fluent API. Даже если он не отвечает на вопрос "Как свободно использовать Apache Components", я считаю, что стоит отметить, что ниже, простейший случай, решение работает для версий, которые имеют ошибку:

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

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