基于JDK11 HttpClient的HTTP工具类,包含微信退款需要的证书加载

/**
 * http工具类
 * 
 * @author Luyao
 *
 */
public class HttpKit {

	/**
	 * 发送GET请求
	 * 
	 * @param url
	 * @return
	 */
	public static String get(String url) {
		return get(url, null);
	}

	/**
	 * 发送GET请求
	 * 
	 * @param url
	 * @param params
	 * @return
	 */
	public static String get(String url, Map<String, String> params) {
		HttpRequest request = HttpRequest.newBuilder(URI.create(buildUrlWithParams(url, params)))
				.header("Content-Type", "application/x-www-form-urlencoded").GET().build();
		return send(request);
	}

	/**
	 * 给访问路径拼接参数
	 * 
	 * @param url
	 * @param params
	 * @return
	 */
	private static String buildUrlWithParams(String url, Map<String, String> params) {
		if (params == null || params.isEmpty()) {
			return url;
		}

		StringBuilder sb = new StringBuilder(url);
		// 若已有参数则和之前的参数合并
		sb.append(url.indexOf('?') == -1 ? '?' : '&');

		// 循环拼接参数
		params.forEach((key, value) -> {
			if (StrKit.notBlank(value)) {
				try {
					value = URLEncoder.encode(value, Constant.CHARSET);
				} catch (UnsupportedEncodingException e) {
					throw new RuntimeException(e);
				}
				sb.append(key).append('=').append(value).append('&');
			}
		});

		// 去掉最后的&
		return sb.substring(0, sb.length() - 1);
	}

	/**
	 * 发送POST请求
	 * 
	 * @param url
	 * @param data
	 * @return
	 */
	public static String post(String url, String data) {
		return post(url, data, null);
	}

	/**
	 * 发送POST请求
	 * 
	 * @param url
	 * @param data
	 * @param params
	 * @return
	 */
	public static String post(String url, String data, Map<String, String> params) {
		HttpRequest request = HttpRequest.newBuilder(URI.create(buildUrlWithParams(url, params)))
				.header("Content-Type", "application/x-www-form-urlencoded")
				.POST(HttpRequest.BodyPublishers.ofString(data, Charset.forName(Constant.CHARSET))).build();
		return send(request);
	}

	/**
	 * 发送带本地证书的POST请求
	 * 
	 * @param url
	 * @param data
	 * @param certFile
	 * @param certPwd
	 * @return
	 */
	public static String postWithCertificate(String url, String data, File certFile, char[] certPwd) {
		HttpRequest request = HttpRequest.newBuilder(URI.create(url))
				.header("Content-Type", "application/x-www-form-urlencoded")
				.POST(HttpRequest.BodyPublishers.ofString(data, Charset.forName(Constant.CHARSET))).build();

		try {
			// 实例化SSL上下文
			SSLContext sslContext = SSLContext.getInstance("TLS");
			// 实例化密钥管理工厂
			KeyManagerFactory keyManagerFactory = KeyManagerFactory
					.getInstance(KeyManagerFactory.getDefaultAlgorithm());
			// 实例化密钥库
			KeyStore keyStore = KeyStore.getInstance("PKCS12");
			// 加载证书文件和密码
			keyStore.load(new FileInputStream(certFile), certPwd);
			// 初始化密钥管理工厂
			keyManagerFactory.init(keyStore, certPwd);
			// 初始化SSL上下文
			sslContext.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());
			// 构建HTTP客户端实例
			HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
			return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).get();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 发送http请求
	 * 
	 * @param request
	 * @return
	 */
	private static String send(HttpRequest request) {
		HttpClient client = HttpClient.newHttpClient();

		try {
			return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).get();
		} catch (InterruptedException | ExecutionException e) {
			throw new RuntimeException(e);
		}
	}
}


评论区

JFinal

2020-04-14 17:35

这个工具很实用,开发微信支付退款功能时用得上,收藏 + 点赞

热门分享

扫码入社