测试类仅仅给出一个 Demo 程序,实际线上使用时,请根据业务情况自行改造 HTTP 请求的代码。
- public class Tools {
- /**
- * 计算签名,参数分别是参数对以及密钥
- *
- * @param requestParams 参数对,即参与计算签名的参数
- * @param secretKey 密钥
- * @return 签名字符串
- * @throws NoSuchAlgorithmException
- * @throws InvalidKeyException
- */
- public static String doHttpSignature(Map<String, String> requestParams, String secretKey) throws NoSuchAlgorithmException, InvalidKeyException {
- List<String> paramList = new ArrayList<String>();
- for (Map.Entry<String, String> entry : requestParams.entrySet()) {
- paramList.add(entry.getKey() + "=" + entry.getValue());
- }
- Collections.sort(paramList);
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < paramList.size(); i++) {
- if (i > 0) {
- sb.append('&');
- }
- sb.append(paramList.get(i));
- }
- return macSignature(sb.toString(), secretKey);
- }
- /**
- * @param text 要签名的文本
- * @param secretKey 阿里云MQ secretKey
- * @return 加密后的字符串
- * @throws InvalidKeyException
- * @throws NoSuchAlgorithmException
- */
- public static String macSignature(String text, String secretKey) throws InvalidKeyException, NoSuchAlgorithmException {
- Charset charset = Charset.forName("UTF-8");
- String algorithm = "HmacSHA1";
- Mac mac = Mac.getInstance(algorithm);
- mac.init(new SecretKeySpec(secretKey.getBytes(charset), algorithm));
- byte[] bytes = mac.doFinal(text.getBytes(charset));
- return new String(Base64.encodeBase64(bytes), charset);
- }
- /**
- * 创建HTTPS 客户端
- *
- * @return 单例模式的客户端
- * @throws KeyStoreException
- * @throws UnrecoverableKeyException
- * @throws NoSuchAlgorithmException
- * @throws KeyManagementException
- */
- private static HttpClient httpClient = null;
- public static HttpClient getHttpsClient() throws KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
- if (httpClient != null) {
- return httpClient;
- }
- X509TrustManager xtm = new X509TrustManager() {
- @Override
- public void checkClientTrusted(X509Certificate[] arg0, String arg1)
- throws CertificateException {
- }
- @Override
- public void checkServerTrusted(X509Certificate[] arg0, String arg1)
- throws CertificateException {
- }
- @Override
- public X509Certificate[] getAcceptedIssuers() {
- return new X509Certificate[]{};
- }
- };
- SSLContext context = SSLContext.getInstance("TLS");
- context.init(null, new TrustManager[]{xtm}, null);
- SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(context, NoopHostnameVerifier.INSTANCE);
- Registry<ConnectionSocketFactory> sfr = RegistryBuilder.<ConnectionSocketFactory>create()
- .register("http", PlainConnectionSocketFactory.INSTANCE)
- .register("https", scsf).build();
- PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager(sfr);
- httpClient = HttpClientBuilder.create().setConnectionManager(pcm).build();
- return httpClient;
- }
- /**
- * 发起HTTPS Get请求,并得到返回的JSON响应
- *
- * @param url 接口URL
- * @param params 参数对
- * @return
- * @throws IOException
- * @throws KeyStoreException
- * @throws UnrecoverableKeyException
- * @throws NoSuchAlgorithmException
- * @throws KeyManagementException
- */
- public static JSONObject httpsGet(String url, Map<String, String> params) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
- HttpClient client = Tools.getHttpsClient();
- JSONObject jsonResult = null;
- //发送get请求
- List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
- for (Map.Entry<String, String> entry : params.entrySet()) {
- urlParameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
- }
- String paramUrl = URLEncodedUtils.format(urlParameters, Charset.forName("UTF-8"));
- HttpGet request = new HttpGet(url + "?" + paramUrl);
- HttpResponse response = client.execute(request);
- if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
- String strResult = EntityUtils.toString(response.getEntity());
- jsonResult = JSON.parseObject(strResult);
- }
- return jsonResult;
- }
- /**
- * 工具方法,发送一个HTTP POST请求,并尝试将响应转换为JSON
- *
- * @param url 请求的方法名URL
- * @param params 参数表
- * @return 如果请求成功则返回JSON,否则抛异常或者返回空
- * @throws IOException
- */
- public static JSONObject httpsPost(String url, Map<String, String> params) throws IOException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
- JSONObject jsonResult = null;
- HttpClient client = getHttpsClient();
- //发送get请求
- HttpPost request = new HttpPost(url);
- List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
- for (Map.Entry<String, String> entry : params.entrySet()) {
- urlParameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
- }
- HttpEntity postParams = new UrlEncodedFormEntity(urlParameters);
- request.setEntity(postParams);
- HttpResponse response = client.execute(request);
- if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
- String strResult = EntityUtils.toString(response.getEntity());
- jsonResult = JSON.parseObject(strResult);
- }
- return jsonResult;
- }
- }