最近做一个项目需要调用rest风格的webservice,但对方提供一个https的url,所以需要忽略证书去访问。httpclient4.3的api相比3.x改动挺大的,所以,把自己实现的分享出来。代码有些乱,大家参考下。有些方法没贴出来。
这个地方需要重生isTrusted方法,达到忽略本地证书的目的。
private SSLConnectionSocketFactory buildSSLContext() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException { SSLContext sslcontext = SSLContexts.custom().setSecureRandom(new SecureRandom()).loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] {"TLSv1"}, null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); return sslsf; }
2. 这部分是具体调用webservice,功能是实现上传一个文件。
CloseableHttpClient httpclient = null;
HttpPost httppost = null; try { // create upload file uploadFile = createUploaFile(user, appCenterUrl, buildTypeId); // get upload url String uploadUrl = getUploadUrl(userMqa, mqaUrl); // get httpclient SSLConnectionSocketFactory sslsf = buildSSLContext(); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); httppost = new HttpPost(uploadUrl); httppost.addHeader(HttpHeaders.AUTHORIZATION, gererateEncoudAuth(userMqa)); FileBody bin = new FileBody(uploadFile); StringBody comment = new StringBody("A binary file of some kind", ContentType.MULTIPART_FORM_DATA); HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("resource", bin).addPart("comment", comment).build(); httppost.setEntity(reqEntity); System.out.println("executing request " + httppost.getRequestLine()); CloseableHttpResponse httpResponse = httpclient.execute(httppost); try { System.out.println(httpResponse.getStatusLine().getStatusCode()); HttpEntity resEntity = httpResponse.getEntity(); if (resEntity != null) { boolean flag = true; System.out.println("Response content length: " + resEntity.getContentLength()); String resultStr = EntityUtils.toString(resEntity); } } finally { if (httpResponse != null) { httpResponse.close(); } } } catch (Exception e) { e.printStackTrace();} finally {
try { if (httppost != null) { httppost.releaseConnection(); } if (httpclient != null) { httpclient.close(); } } catch (IOException e) { e.printStackTrace(); } }