HttpClient 相对于 HttpUrlConnection 来说功能更加强大,用起来也更简单,可以看做是增强版的 HttpURLConnection。本文记录通过HttpClient发送一些常用请求的方法。
普通GET请求
public static String get(String httpUrl) {
String result = "";
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpGet request = new HttpGet(httpUrl);
// 自定义请求头。例如在请求头中添加 jwt-token
request.setHeader("xxx", "xxx");
try (CloseableHttpResponse response = httpClient.execute(request)) {
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null){
result = EntityUtils.toString(responseEntity,"utf-8");
System.out.println("响应内容:" + result);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
普通POST请求
public static String post(String httpUrl, String jsonParams) {
String result = "";
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpPost request = new HttpPost(httpUrl);
request.setHeader("Content-Type", "application/json");
// 自定义请求头。例如在请求头中添加 jwt-token
request.setHeader("xxx", "xxx");
StringEntity entity = new StringEntity(jsonParams, "UTF-8");
request.setEntity(entity);
try (CloseableHttpResponse response = httpClient.execute(request)) {
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null){
result = EntityUtils.toString(responseEntity,"utf-8");
System.out.println("响应内容:" + result);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
POST请求发送文件
/**
* 发送文件
* @param httpUrl 要发送请求的url
* @param filePath 要发送的文件路径
* @param params 参数列表
* @param headerMap header参数
*/
public static void postFile(String httpUrl, String filePath, Map<String,
String> params, Map<String, String> headerMap) {
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpPost post = new HttpPost(httpUrl);
// 自定义请求头,比如添加 token 等
if (headerMap != null) {
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
post.setHeader(entry.getKey(), entry.getValue());
}
}
// 将 java.io.File 对象添加到 HttpEntity 对象中
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(Charset.forName("utf-8"));
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); // 设置浏览器兼容
builder.addPart("file", new FileBody(new File(filePath)));
// 设置其它参数
if (params != null) {
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.addPart(entry.getKey(),
new StringBody(entry.getValue(),
ContentType.create("text/plain", Consts.UTF_8)));
}
}
post.setEntity(builder.build());
// 发送请求并获取结果
try (CloseableHttpResponse response = httpClient.execute(post)) {
HttpEntity entity = response.getEntity();
if (entity != null){
log.info("响应内容:" + EntityUtils.toString(entity));
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Https请求并信任所有证书
public static String httpsGet(String httpsUrl) {
String result = "";
try (CloseableHttpClient httpClient = createSSLClientDefault()) {
HttpGet request = new HttpGet(httpsUrl);
// 自定义请求头。例如在请求头中添加 jwt-token
request.setHeader("xxx", "xxx");
try (CloseableHttpResponse response = httpClient.execute(request)) {
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null){
result = EntityUtils.toString(responseEntity, "utf-8");
log.info("响应内容:" + result);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
public static CloseableHttpClient createSSLClientDefault() {
try {
// 使用 loadTrustMaterial() 方法实现一个信任策略,信任所有证书
SSLContext sslContext = new SSLContextBuilder()
.loadTrustMaterial(null, (chain, authType) -> true).build();
// NoopHostnameVerifier: 主机名验证工具,它关闭了主机名验证,接受任何有效的SSL会话并匹配到目标主机
HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
} catch (Exception e) {
e.printStackTrace();
}
return HttpClients.createDefault();
}