我正在尋找使用 POST 表單資料的解決方案HttpAsyncClient。到目前為止,我發現的所有示例都只發送了簡單的 GET 請求。這是我到目前為止所得到的:
try (CloseableHttpAsyncClient client = HttpAsyncClients.createDefault()) {
SimpleHttpRequest httpPost = SimpleHttpRequests.post("http://httpbin.org");
// How to add key=value as form data to httpPost?
Future<SimpleHttpResponse> future = client.execute(httpPost, new FutureCallback<SimpleHttpResponse>() {
@Override
public void completed(SimpleHttpResponse simpleHttpResponse) {
System.out.println(simpleHttpResponse.getCode());
System.out.println(simpleHttpResponse.getBody());
}
@Override
public void failed(Exception e) {
System.out.println(e);
}
@Override
public void cancelled() {
System.out.println("cancelled");
}
}
}
我還查看了源代碼,在那里找到了SimpleHttpRequest::setBody方法和相應的SimpleBody類。但它們似乎也不支持表單資料。
基本上,我需要相當于OkHttp's FormBody。
uj5u.com熱心網友回復:
在對 Apache HttpComponents 5 的檔案和源代碼進行了一些挖掘之后,我想出了以下解決方案。SimpleHttpRequests我需要創建一個AsyncRequestProducer和一個,而不是使用AsyncResponseConsumer。請求生產者物件定義了如何創建我的請求,與 相比SimpleHttpRequest,它還能夠生成我需要的表單主體。示例代碼:
try (CloseableHttpAsyncClient client = HttpAsyncClients.createDefault()) {
client.start();
AsyncRequestProducer producer = AsyncRequestBuilder.post()
.setUri("http://httpbin.org")
.addParameter("key", "value") // <- form parameters in body
.build();
AsyncResponseConsumer<SimpleHttpResponse> consumer = SimpleResponseConsumer.create();
client.execute(producer, consumer, new FutureCallback<SimpleHttpResponse>() {
@Override
public void completed(SimpleHttpResponse simpleHttpResponse) {
System.out.println(simpleHttpResponse.getCode());
System.out.println(simpleHttpResponse.getBody());
}
@Override
public void failed(Exception e) {
System.out.println(e);
}
@Override
public void cancelled() {
System.out.println("cancelled");
}
});
}
或者,我可以使用 anAsyncEntityProducer來生成表單主體:
Iterable<NameValuePair> params = Stream.of(new BasicNameValuePair("key", "value"))
.collect(Collectors.toList());
AsyncEntityProducer entityProducer = AsyncEntityProducers.createUrlEncoded(params, Charsets.UTF_8);
AsyncRequestProducer producer = AsyncRequestBuilder.post()
.setUri("http://httpbin.org")
.setEntity(entityProducer)
.build();
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/344626.html
標籤:爪哇 异步 apache-http组件
下一篇:根據按鈕名稱顯示模態
