Apache组件HttpPost使用方法
需求:
1.java模拟https协议请求,屏蔽SSL校验报错问题
2.将map转成form表单形式提交后台服务。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 使用HttpPost 提交form请求
*1。去掉SSL证书校验,使用自定义SSLContext和主机名验证器。
* 2。构建请求参数:
使用 List<NameValuePair> 来存储请求参数。
遍历 paramsMap,将每个键值对添加到 params 列表中。
设置请求体:
使用 UrlEncodedFormEntity 将 params 列表转换为表单格式的请求体。
设置编码为 UTF-8。
执行请求:
使用 httpClient.execute(httpPost) 发送请求,并处理响应。
通过这种方式,你可以确保请求体以 application/x-www-form-urlencoded 格式提交,符合表单提交的标准。
*/
public class HttpClientExample {
private static ObjectMapper objectMapper = new ObjectMapper();
public static void main(String[] args) throws Exception {
// 创建SSLContext来忽略证书验证
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (X509Certificate[] chain, String authType) -> true).build();
// 设置主机名验证器(通常不建议关闭)
X509HostnameVerifier hostnameVerifier = new AllowAllHostnameVerifier(); // 使用自定义SSLContext创建CloseableHttpClient
CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).setHostnameVerifier(hostnameVerifier).build();
// 1. 创建HttpRequest对象 - 指定好 url 地址
HttpPost httpPost = new HttpPost("https://www.baidu.com"); //
Map<String, Object> paramsMap = new HashMap();
paramsMap.put("name", "test");
paramsMap.put("password", "test");
//form表单提交内容
List<NameValuePair> params = new ArrayList<>();
for (Map.Entry<String, Object> entry : paramsMap.entrySet()) {
params.add(new BasicNameValuePair(entry.getKey(), String.valueOf(entry.getValue())));
}
// 设置请求体为 UrlEncodedFormEntity
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));//请求报文体
Map dataMap =null;
try {
CloseableHttpResponse response = httpClient.execute(httpPost);
// 处理响应
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
String responseBody = null;
try {
responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
Map responseMap = objectMapper.readValue(responseBody, Map.class);
System.out.println("返回报文:"+responseMap);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
} else {
throw new RuntimeException("Failed to perform check-in. Status code: " + statusCode);
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}