之前很长一段时间开发android开发 网络通信都是用的http,后来到了现在的公司,网络通信是https,理论上https比http更加安全,但是公司是自建证书(后来问了一些朋友有的公司为了降低成本都没有买,都是自建证书),所以通信的过程需要绕开证书(也可以叫做信任证书),http和https在通信过程中是有一点不一样的,废话不多说直接上源码 我通信这一块用到的是RxAndroid+RxJava+OkHttp3,目前比较主流的网络请求框架。
import android.util.Log; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.concurrent.TimeUnit; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import rx.Observable; import rx.Subscriber; /** * Created by mrpanda on 4/5/17. */ public class HTTPSRequestUtils { private static OkHttpClient okHttpClient; public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); public static Observable<String> getJson(final String path, final String json){ return Observable.create(new Observable.OnSubscribe<String>(){ @Override public void call(Subscriber<? super String> subscriber) { if(!subscriber.isUnsubscribed()){ okHttpClient = new OkHttpClient.Builder() .sslSocketFactory(createSSLSocketFactory()) .hostnameVerifier(new TrustAllHostnameVerifier()) .connectTimeout(60, TimeUnit.SECONDS) .writeTimeout(100, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build(); RequestBody requestBody= RequestBody.create(JSON,json); Request request=new Request.Builder() .url(path) .post(requestBody) .build(); try{ Response response= okHttpClient.newCall(request).execute(); Log.e("response",response.toString()); if(response.isSuccessful()){ subscriber.onNext(response.body().string()); }else{ subscriber.onNext("获取失败!"); } subscriber.onCompleted(); }catch (Exception e){ e.printStackTrace(); } } } }); } private static class TrustAllCerts 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 new X509Certificate[0];} } private static class TrustAllHostnameVerifier implements HostnameVerifier { @Override public boolean verify(String hostname, SSLSession session) { return true; } } private static SSLSocketFactory createSSLSocketFactory() { SSLSocketFactory ssfFactory = null; try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, new TrustManager[] { new TrustAllCerts() }, new SecureRandom()); ssfFactory = sc.getSocketFactory(); } catch (Exception e) { } return ssfFactory; } }