Apache HttpComponents 5 如何使用HttpAsyncClient发送POST表单数据
HttpAsyncClient 5.x 发送POST表单数据解决方案
你可以直接借助 HttpClient 内置的表单编码工具类将键值对参数序列化为标准application/x-www-form-urlencoded格式字符串,再绑定到请求体即可,效果完全等同于OkHttp的FormBody。
完整实现代码
import org.apache.hc.core5.http.ContentType; import org.apache.hc.core5.http.NameValuePair; import org.apache.hc.core5.http.message.BasicNameValuePair; import org.apache.hc.core5.net.URLEncodedUtils; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient; import org.apache.hc.client5.http.impl.async.HttpAsyncClients; import org.apache.hc.client5.http.async.methods.SimpleHttpRequest; import org.apache.hc.client5.http.async.methods.SimpleHttpRequests; import org.apache.hc.client5.http.async.methods.SimpleHttpResponse; import org.apache.hc.core5.concurrent.FutureCallback; public class AsyncFormPostTest { public static void main(String[] args) throws Exception { try (CloseableHttpAsyncClient client = HttpAsyncClients.createDefault()) { // 启动异步客户端 client.start(); SimpleHttpRequest httpPost = SimpleHttpRequests.post("http://httpbin.org/post"); // 构造表单参数列表 List<NameValuePair> formParams = new ArrayList<>(); formParams.add(new BasicNameValuePair("key1", "value1")); formParams.add(new BasicNameValuePair("key2", "value2")); // 序列化为url编码格式的表单字符串 String encodedFormBody = URLEncodedUtils.format(formParams, StandardCharsets.UTF_8); // 绑定请求体,自动设置对应Content-Type请求头 httpPost.setBody(encodedFormBody, ContentType.APPLICATION_FORM_URLENCODED); Future<SimpleHttpResponse> future = client.execute(httpPost, new FutureCallback<SimpleHttpResponse>() { @Override public void completed(SimpleHttpResponse simpleHttpResponse) { System.out.println(simpleHttpResponse.getCode()); System.out.println(simpleHttpResponse.getBodyText()); } @Override public void failed(Exception e) { e.printStackTrace(); } @Override public void cancelled() { System.out.println("请求已取消"); } }); // 阻塞等待请求完成,避免主线程提前退出 future.get(); } } }
关键说明
- 你之前找到的
SimpleHttpRequest::setBody方法完全支持表单数据,只需要传入序列化后的表单字符串以及对应的ContentType.APPLICATION_FORM_URLENCODED类型即可 URLEncodedUtils工具类会自动处理参数编码、特殊字符转义、键值对拼接逻辑,不需要手动处理格式- 必须调用
client.start()启动异步客户端,否则请求不会被执行
内容的提问来源于stack exchange,提问作者Green 绿色
相关产品推荐
相关产品推荐

