1. 程式人生 > >Android開發框架xUtils3.x新手教學(二)HTTPS訪問

Android開發框架xUtils3.x新手教學(二)HTTPS訪問

現在越來越多的專案採用Https安全通訊,今天來介紹一下xUtils裡如何使用Https。

一、弄一個SSL證書(.crt檔案),放到專案assets目錄下。

二、建立HttpUtils類,程式碼如下:

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;

/**
 * HttpUtil
 * 專案名稱: 
 * 包:      
 * 類名稱:    HttpUtil
 * 類描述:    Http請求工具類
 * 建立人:    XuJiayin
* 建立時間: 2016-03-16 * 修改人: XuJiayin * 修改時間: 2016-03-16 * 修改備註: Http請求工具類 * 版本: v1.0 */ public class HttpUtil { /** Https 證書驗證物件 */ private static SSLContext s_sSLContext = null; /** * Https請求傳送 * @param context Activity(fragment)的資源上下文 * @param params 傳送的請求 * @param
callBack 回撥物件(具體介面形式參見xUtils sample的httpFragment.java) * @return true=正常呼叫 false=異常呼叫 */ public static boolean send(Context context, RequestParams params, Callback.CommonCallback callBack) { /* 判斷https證書是否成功驗證 */ SSLContext sslContext = getSSLContext(context); if(null == sslContext){ if
(BuildConfig.DEBUG) Log.d("HttpUtil", "Error:Can't Get SSLContext!"); return false; } //繫結SSL證書 params.setSslSocketFactory(sslContext.getSocketFactory()); x.http().request(HttpMethod.POST, params, callBack); return true; } /** * Https下載圖片 * @param context Activity(fragment)的資源上下文 * @return InputStream */ public static InputStream getRequestInputstream(Context context, String path) throws Exception { /* 判斷https證書是否成功驗證 */ SSLContext sslContext = getSSLContext(context); if(null == sslContext){ if (BuildConfig.DEBUG) Log.d("HttpUtil", "Error:Can't Get SSLContext!"); return null; } //繫結SSL證書 java.net.URL url = new java.net.URL(path); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setSSLSocketFactory(sslContext.getSocketFactory()); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setDoInput(true); //連線 conn.connect(); return conn.getInputStream(); } /** * Https請求傳送(同步請求 上傳圖片使用) * @param context Activity(fragment)的資源上下文 * @param params 傳送的請求 * @param callBack 回撥物件(具體介面形式參見xUtils sample的httpFragment.java) * @return true=正常呼叫 false=異常呼叫 */ public static boolean sendSync(Context context, RequestParams params, Callback.TypedCallback callBack) throws Throwable { /* 判斷https證書是否成功驗證 */ SSLContext sslContext = getSSLContext(context); if(null == sslContext){ if (BuildConfig.DEBUG) Log.d("HttpUtil", "Error:Can't Get SSLContext!"); return false; } //繫結SSL證書 params.setSslSocketFactory(sslContext.getSocketFactory()); x.http().requestSync(HttpMethod.POST, params, callBack); return true; } /** * 獲取Https的證書 * @param context Activity(fragment)的上下文 * @return SSL的上下文物件 */ private static SSLContext getSSLContext(Context context) { if (null != s_sSLContext) { return s_sSLContext; } //以下程式碼來自百度 參見http://www.tuicool.com/articles/vmUZf2 CertificateFactory certificateFactory = null; InputStream inputStream = null; KeyStore keystore = null; String tmfAlgorithm = null; TrustManagerFactory trustManagerFactory = null; try { certificateFactory = CertificateFactory.getInstance("X.509"); inputStream = context.getAssets().open("leichi.crt");//這裡匯入SSL證書檔案 // inputStream = context.getAssets().open("51p2b_server_bs.pem");//這裡匯入SSL證書檔案 Certificate ca = certificateFactory.generateCertificate(inputStream); keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(null, null); keystore.setCertificateEntry("ca", ca); tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); trustManagerFactory = TrustManagerFactory.getInstance(tmfAlgorithm); trustManagerFactory.init(keystore); // Create an SSLContext that uses our TrustManager s_sSLContext = SSLContext.getInstance("TLS"); s_sSLContext.init(null, trustManagerFactory.getTrustManagers(), null); return s_sSLContext; } catch (CertificateException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }

三、如何使用?

//宣告:網路請求引數
RequestParams params = new RequestParams(URL);
params.addBodyParameter("param", "Hello xUtils!");    // 新增引數
/** 傳送登入請求 */
HttpUtil.send(content, params, new Callback.CommonCallback<String>() {//回撥函式內容});
這裡我們使用了GSON來序列化JSON字串,如果沒這個需要的同學,直接呼叫addBodyParameter新增要傳的引數即可。

使用GSON不在本教程之內,請大家自行查閱。