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