HttpClient和OkHttp关于Https请求问题
pangyanming
9年前
来自: http://blog.csdn.net//guijiaoba/article/details/45490479
项目中遇到登录接口,使用的时https接口,所以客户端必须要进行配置,原先的项目使用的时Apache的Httpclient,Android的api接口也内置了httpclient,但是Android系统在4.x以后不建议使用了Httpclient,推荐使用urlconnection,但是urlconnection毕竟太过于原始,所以我选择了okhttp作为http请求库。
由于服务器使用的是通用的https加密,所以我在这里只是介绍通用的加密方式。
Httpclient
static class SSLSocketFactoryEx extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public SSLSocketFactoryEx(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }; sslContext.init(null, new TrustManager[]{tm}, null); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); } @Override public Socket createSocket() throws IOException { return sslContext.getSocketFactory().createSocket(); } } static HttpClient getNewHttpClient() { try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); SSLSocketFactoryEx sf = new SSLSocketFactoryEx(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); registry.register(new Scheme("https", sf, 443)); ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); return new DefaultHttpClient(ccm, params); } catch (Exception e) { return new DefaultHttpClient(); } }
OkHttp
static class HttpStackPlus extends HurlStack { private final OkUrlFactory mFactory; public HttpStackPlus() { this(new OkHttpClient()); } public HttpStackPlus(OkHttpClient client) { if (client == null) { throw new NullPointerException("Client must not be null."); } else { try { TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }; SSLContext e = SSLContext.getInstance("TLS"); e.init(null, new TrustManager[]{tm}, null); client.setSslSocketFactory(e.getSocketFactory()); } catch (Exception e) { throw new AssertionError(); } this.mFactory = new OkUrlFactory(client); } } protected HttpURLConnection createConnection(URL url) throws IOException { return this.mFactory.open(url); } } public static RequestQueue newRequestQueue(Context context) { return Volley.newRequestQueue(context, new HttpStackPlus()); }