1、首先创建MyHttps的工具类
2、然后引入一个通用的证书管理器类,进行https请求的时候要用到import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.X509TrustManager; public class MyX509TrustManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } @Override public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } }
3、首先写入https的get请求,参数为请求地址和请求头键值对,返回值为响应头键值对与String类型的返回内容组成的Object数组/** * 发起Https的get请求 * @param property 请求头参数 * @url 请求的地址 * @return 响应内容[Map<String, List<String>>(响应头),String(响应体)] */ public static Object[] get(String url,LinkedHashMap<String, String> property) { Map<String, List<String>> headerFields = null; StringBuffer buffer=null; try{ //创建SSLContext SSLContext sslContext=SSLContext.getInstance("TLS"); TrustManager[] tm={new MyX509TrustManager()}; //初始化 sslContext.init(null, tm, new java.security.SecureRandom());; //获取SSLSocketFactory对象 SSLSocketFactory ssf=sslContext.getSocketFactory(); URL u=new URL(url); HttpsURLConnection conn=(HttpsURLConnection)u.openConnection(); Set<String> keySet = property.keySet(); for (String key : keySet) { conn.setRequestProperty(key, property.get(key)); } //设置当前实例使用的SSLSoctetFactory System.out.println("开始链接"); conn.setSSLSocketFactory(ssf); conn.connect(); System.out.println("链接成功"); //读取服务器返回的响应头 headerFields = conn.getHeaderFields(); //读取服务器端返回的内容 InputStream is=conn.getInputStream(); InputStreamReader isr=new InputStreamReader(is,"utf-8"); BufferedReader br=new BufferedReader(isr); buffer=new StringBuffer(); String line=null; while((line=br.readLine())!=null){ buffer.append(line); } }catch(Exception e){ e.printStackTrace(); } Object[] response = {headerFields, buffer.toString()}; return response; }
4、以及post请求,其实就是在https的get请求的基础上加上post请求的粝简肯惧内容,这个http的get和post请求的区别是一样的/** * 发情https的post请求 * @param url 目标地址 * @param property 请求头参数 * @param content 请求内容 * @return 响应内容[Map<String, List<String>>(响应头),String(响应体)] */ public static Object[] post(String url,LinkedHashMap<String, String> property,String content) { StringBuffer buffer=null; Map<String, List<String>> headerFields = null; try{ //创建SSLContext SSLContext sslContext=SSLContext.getInstance("TLS"); TrustManager[] tm={new MyX509TrustManager()}; //初始化 sslContext.init(null, tm, new java.security.SecureRandom());; //获取SSLSocketFactory对象 SSLSocketFactory ssf=sslContext.getSocketFactory(); URL u=new URL(url); HttpsURLConnection conn=(HttpsURLConnection)u.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); Set<String> keySet = property.keySet(); for (String key : keySet) { conn.setRequestProperty(key, property.get(key)); } //设置当前实例使用的SSLSoctetFactory System.out.println("开始链接"); conn.setSSLSocketFactory(ssf); conn.connect(); DataOutputStream os = new DataOutputStream( conn.getOutputStream() ); os.writeBytes(content); os.flush(); os.close(); System.out.println("链接成功"); //读取服务器返回的响应头 headerFields = conn.getHeaderFields(); //读取服务器端返回的内容 InputStream is=conn.getInputStream(); InputStreamReader isr=new InputStreamReader(is,"utf-8"); BufferedReader br=new BufferedReader(isr); buffer=new StringBuffer(); String line=null; while((line=br.readLine())!=null){ buffer.append(line); } }catch(Exception e){ e.printStackTrace(); } Object[] response = {headerFields, buffer.toString()}; return response; }
5、另外还有一个put请求以及一个get的img下载请求不再贴出,可以再第六步的全部代码中看到,这里我讲一下https请求和http请求差异的地方,https请求,要先创建ssl套接字安全层,然后将这个安全层套在连接上,之后再进行网络连接请求
6、最后贴一下这个https工具栏的完私网褡爸整的代码:import java.io.BufferedReader;i罪焐芡拂mport java.io.DataOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSocketFactory;import javax.net.ssl.TrustManager;import tool.MyX509TrustManager;/*** 进行Https请求* @author 枫**/public class MyHttps { /** * 发起Https的get请求 * @param property 请求头参数 * @url 请求的地址 * @return 响应内容[Map<String, List<String>>(响应头),String(响应体)] */ public static Object[] get(String url,LinkedHashMap<String, String> property) { Map<String, List<String>> headerFields = null; StringBuffer buffer=null; try{ //创建SSLContext SSLContext sslContext=SSLContext.getInstance("TLS"); TrustManager[] tm={new MyX509TrustManager()}; //初始化 sslContext.init(null, tm, new java.security.SecureRandom());; //获取SSLSocketFactory对象 SSLSocketFactory ssf=sslContext.getSocketFactory(); URL u=new URL(url); HttpsURLConnection conn=(HttpsURLConnection)u.openConnection(); Set<String> keySet = property.keySet(); for (String key : keySet) { conn.setRequestProperty(key, property.get(key)); } //设置当前实例使用的SSLSoctetFactory System.out.println("开始链接"); conn.setSSLSocketFactory(ssf); conn.connect(); System.out.println("链接成功"); //读取服务器返回的响应头 headerFields = conn.getHeaderFields(); //读取服务器端返回的内容 InputStream is=conn.getInputStream(); InputStreamReader isr=new InputStreamReader(is,"utf-8"); BufferedReader br=new BufferedReader(isr); buffer=new StringBuffer(); String line=null; while((line=br.readLine())!=null){ buffer.append(line); } }catch(Exception e){ e.printStackTrace(); } Object[] response = {headerFields, buffer.toString()}; return response; } /** * 发起Https的get请求 * @param property 请求头参数 * @param path * @return * @url 请求的地址 * @return 响应内容[Map<String, List<String>>(响应头),String(响应体)] */ public static boolean getImg(String url,LinkedHashMap<String, String> property, String path) { InputStream is = null; try { Map<String, List<String>> headerFields = null; StringBuffer buffer=null; //创建SSLContext SSLContext sslContext=SSLContext.getInstance("TLS"); TrustManager[] tm={new MyX509TrustManager()}; //初始化 sslContext.init(null, tm, new java.security.SecureRandom());; //获取SSLSocketFactory对象 SSLSocketFactory ssf=sslContext.getSocketFactory(); URL u=new URL(url); HttpsURLConnection conn=(HttpsURLConnection)u.openConnection(); Set<String> keySet = property.keySet(); for (String key : keySet) { conn.setRequestProperty(key, property.get(key)); } //设置当前实例使用的SSLSoctetFactory System.out.println("开始链接"); conn.setSSLSocketFactory(ssf); conn.connect(); System.out.println("链接成功"); //读取服务器返回的响应头 headerFields = conn.getHeaderFields(); //读取服务器端返回的内容 is = conn.getInputStream(); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } try { FileOutputStream out = new FileOutputStream(new File(path)); //文件缓存区 byte[] buffer = new byte[10240000]; int len = 0; while( (len=is.read(buffer)) != -1 ){ out.write(buffer, 0, len); } out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } return true; } /** * 发情https的post请求 * @param url 目标地址 * @param property 请求头参数 * @param content 请求内容 * @return 响应内容[Map<String, List<String>>(响应头),String(响应体)] */ public static Object[] post(String url,LinkedHashMap<String, String> property,String content) { StringBuffer buffer=null; Map<String, List<String>> headerFields = null; try{ //创建SSLContext SSLContext sslContext=SSLContext.getInstance("TLS"); TrustManager[] tm={new MyX509TrustManager()}; //初始化 sslContext.init(null, tm, new java.security.SecureRandom());; //获取SSLSocketFactory对象 SSLSocketFactory ssf=sslContext.getSocketFactory(); URL u=new URL(url); HttpsURLConnection conn=(HttpsURLConnection)u.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); Set<String> keySet = property.keySet(); for (String key : keySet) { conn.setRequestProperty(key, property.get(key)); } //设置当前实例使用的SSLSoctetFactory System.out.println("开始链接"); conn.setSSLSocketFactory(ssf); conn.connect(); DataOutputStream os = new DataOutputStream( conn.getOutputStream() ); os.writeBytes(content); os.flush(); os.close(); System.out.println("链接成功"); //读取服务器返回的响应头 headerFields = conn.getHeaderFields(); //读取服务器端返回的内容 InputStream is=conn.getInputStream(); InputStreamReader isr=new InputStreamReader(is,"utf-8"); BufferedReader br=new BufferedReader(isr); buffer=new StringBuffer(); String line=null; while((line=br.readLine())!=null){ buffer.append(line); } }catch(Exception e){ e.printStackTrace(); } Object[] response = {headerFields, buffer.toString()}; return response; } /** * 发情https的put请求 * @param url 目标地址 * @param property 请求头参数 * @param content 请求内容 * @return 响应内容[Map<String, List<String>>(响应头),String(响应体)] */ public static Object[] put(String url,LinkedHashMap<String, String> property,String content) { StringBuffer buffer=null; Map<String, List<String>> headerFields = null; try{ //创建SSLContext SSLContext sslContext=SSLContext.getInstance("TLS"); TrustManager[] tm={new MyX509TrustManager()}; //初始化 sslContext.init(null, tm, new java.security.SecureRandom());; //获取SSLSocketFactory对象 SSLSocketFactory ssf=sslContext.getSocketFactory(); URL u=new URL(url); HttpsURLConnection conn=(HttpsURLConnection)u.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod("PUT"); Set<String> keySet = property.keySet(); for (String key : keySet) { conn.setRequestProperty(key, property.get(key)); } //设置当前实例使用的SSLSoctetFactory System.out.println("开始链接"); conn.setSSLSocketFactory(ssf); conn.connect(); DataOutputStream os = new DataOutputStream( conn.getOutputStream() ); os.writeBytes(content); os.flush(); os.close(); System.out.println("链接成功"); //读取服务器返回的响应头 headerFields = conn.getHeaderFields(); //读取服务器端返回的内容 InputStream is=conn.getInputStream(); InputStreamReader isr=new InputStreamReader(is,"utf-8"); BufferedReader br=new BufferedReader(isr); buffer=new StringBuffer(); String line=null; while((line=br.readLine())!=null){ buffer.append(line); } }catch(Exception e){ e.printStackTrace(); } Object[] response = {headerFields, buffer.toString()}; return response; }}