Как свободно использовать компоненты 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()
, но я получаю ту же ошибку.
Ответы
Ответ 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
}
}
В моем случае переопределение не было вариантом, поэтому это было лучшее решение.