开源库android-async-http添加https请求方式
来源:互联网 发布:商业银行数据质量评估 编辑:程序博客网 时间:2024/05/29 17:34
这几天由于项目要求将http转换成https请求,要求不做证书验证。而我使用的是loopj的开源库android-async-http来完成服务器请求,但是此库并未有相关https的示例,故自己动手丰衣足食。
经过一番摸索,现记录如下:
经过一番摸索,现记录如下:
封装了一个httpclient帮助类,以此获取一个DefaultHttpClient的示例对象。
import java.io.IOException;import java.net.Socket;import java.net.UnknownHostException;import java.security.KeyManagementException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.UnrecoverableKeyException;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.http.HttpVersion;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.params.ConnManagerParams;import org.apache.http.conn.params.ConnPerRouteBean;import org.apache.http.conn.scheme.PlainSocketFactory;import org.apache.http.conn.scheme.Scheme;import org.apache.http.conn.scheme.SchemeRegistry;import org.apache.http.conn.ssl.SSLSocketFactory;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;import org.apache.http.params.BasicHttpParams;import org.apache.http.params.HttpConnectionParams;import org.apache.http.params.HttpProtocolParams;/** * @author Administrator * 注意所导入的包,故将引入的包也贴上,防止错误。 */public class HttpClientHelper { private static DefaultHttpClient httpClient; private static final String VERSION = "1.1"; /** http请求最大并发连接数 */ private static final int DEFAULT_MAX_CONNECTIONS = 10; /** 超时时间,默认10秒 */ private static final int DEFAULT_SOCKET_TIMEOUT = 30 * 1000; /** 默认的套接字缓冲区大小 */ private static final int DEFAULT_SOCKET_BUFFER_SIZE = 8192; private static int maxConnections = DEFAULT_MAX_CONNECTIONS; private static int socketTimeout = DEFAULT_SOCKET_TIMEOUT; private HttpClientHelper() { } public static synchronized DefaultHttpClient getHttpClient() { if (null == httpClient) { // 初始化工作 try { KeyStore trustStore = KeyStore.getInstance(KeyStore .getDefaultType()); trustStore.load(null, null); BasicHttpParams httpParams = new BasicHttpParams(); ConnManagerParams.setTimeout(httpParams, socketTimeout); ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(maxConnections)); ConnManagerParams.setMaxTotalConnections(httpParams, DEFAULT_MAX_CONNECTIONS); HttpConnectionParams.setSoTimeout(httpParams, socketTimeout); HttpConnectionParams.setConnectionTimeout(httpParams, socketTimeout); HttpConnectionParams.setTcpNoDelay(httpParams, true); HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE); HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1); HttpProtocolParams.setUserAgent(httpParams, String .format("thinkandroid/%s (http://www.thinkandroid.cn)", VERSION)); // 设置 https支持 SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); // 允许所有主机的验证 SchemeRegistry schReg = new SchemeRegistry(); schReg.register(new Scheme("http", PlainSocketFactory .getSocketFactory(), 80)); schReg.register(new Scheme("https", sf, 443)); schReg.register(new Scheme("https", sf, 8443)); ClientConnectionManager conManager = new ThreadSafeClientConnManager( httpParams, schReg); httpClient = new DefaultHttpClient(conManager, httpParams); } catch (Exception e) { e.printStackTrace(); return new DefaultHttpClient(); } } return httpClient; }}class SSLSocketFactoryEx extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public SSLSocketFactoryEx(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); TrustManager tm = new X509TrustManager() { @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted( java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } @Override public void checkServerTrusted( java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } }; 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(); }}
然后在开源库的AsyncHttpClient类中将原来的 httpClient = new DefaultHttpClient(cm, httpParams)替换成httpClient = HttpClientHelper.getHttpClient()即可。
这个封装类大家可以拿去用的。只要是不做证书验证。如果需要加载证书验证的,对客户端来说比较简单。可以去google下。
原文作者: 469874851
原文地址: http://my.eoe.cn/smile_it/archive/15125.html
0 1
- 开源库android-async-http添加https请求方式
- 开源库android-async-http添加https请求方式
- android-async-http开源库实现https
- android android-async-http https
- Android网络请求库 android-async-http
- Android网络请求框架android-async-http
- 网络请求一 : android-async-http
- 网络请求库之android-async-http
- Http请求之android-async-http 异步框架请求
- android http 和https请求
- android-async-http Android网络请求请求库
- Http和Https网络同步请求httpclient和异步请求async-http-client
- Android Http异步请求类库:android-async-http
- Android 异步 HTTP 请求库:android-async-http-cached
- android http 请求方式
- android Http请求方式
- android-async-http 异步网络请求客户端请求接口
- Android基于http的网络请求async-http框架
- 我的第一个博客
- 福昕软件开发有限公司 Android笔试题
- WCF开发实战系列一:创建第一个WCF服务
- Java ascii to hex
- CCTouchDispatcher测试总结
- 开源库android-async-http添加https请求方式
- 浅谈JavaScript的事件机制
- Xcode Architectures配置
- 患得患失的人生
- WCF开发实战系列二:使用IIS发布WCF服务
- Ubuntu使用问题集及解决方案(不定期更新)
- 裁剪eps文件
- Javascript URL编码方法的比较
- 报错解决Argument 1 passed to model::get***() must be an instance of Entity_hotel, instance