java原生API发送https请求

一、原生API依赖引用

注意不要引用错误,否则会引发诡异错误。

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import sun.net.www.protocol.https.Handler;

二、自定义TrainX509TrustManager

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class TrainX509TrustManager implements  X509TrustManager{  

    @Override  
    public void checkClientTrusted(X509Certificate[] chain, String authType)  
            throws CertificateException {  
    }  

    @Override  
    public void checkServerTrusted(X509Certificate[] chain, String authType)  
            throws CertificateException {  
    }  

    @Override  
    public X509Certificate[] getAcceptedIssuers() {  
        return null;  
    }  
}

三、示例代码

public String readURLByHttpsGet(String url, String charset) throws Exception {
        //发送https前的准备工作
        TrustManager[] tm = { new TrainX509TrustManager() };    
        SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");    
        sslContext.init(null, tm, new java.security.SecureRandom());       
        SSLSocketFactory ssf = sslContext.getSocketFactory();    

        String content = "";
        // 尝试连10次
        boolean suc = false ;
        for (int i = 0; i < 10; i++) {
            try {
//              URL net = new URL(url);//此法会抛异常
                URL net = new URL(null,url,new Handler());//重要,必须要传入new Handler(),否则会抛异常
                InputStream in = null;
                HttpsURLConnection conn = (HttpsURLConnection) net.openConnection();//重要
                conn.setSSLSocketFactory(ssf);//重要
                conn.setConnectTimeout(60000);
                conn.setReadTimeout(60000);
                in = conn.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(in, charset));
                StringBuffer sb = new StringBuffer();
                int ch;
                while ((ch = br.read()) != -1) {
                    sb.append((char) ch);
                }
                in.close();
                content = sb.toString();
                suc = true;
                break;
            } catch (Exception e) {
                e.printStackTrace();
                if (i == 9) {
                    break;
                }
                continue;
            }
        }
        if(!suc){
            throw new Exception("读取 失败:"+url) ;
        }
        return content;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值