成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android網(wǎng)絡(luò)--我是怎么做的: Volley+OkHttp+Https

移動開發(fā)
Volley 已經(jīng)發(fā)布很長時間了, 也已被廣泛應(yīng)用, 相關(guān)教程到處都是. 本文只說兩個值得注意的地方. 本文講解部分比較少, 請參閱提供的相關(guān)鏈接. 完整的實現(xiàn)代碼在 Github dodocat/AndroidNetworkDemo 可能看起來比這里更清晰.

使用 OkHttp 作為傳輸層的實現(xiàn).

Volley 默認(rèn)根據(jù) Android 系統(tǒng)版本使用不同的 Http 傳輸協(xié)議實現(xiàn).
在 Android 3.0 以上 Volley 使用 ApacheHttpStack 作為傳輸協(xié)議, 在2.3 及以下使用 HttpURLConnection 作為傳輸層協(xié)議

OkHttp 相較于其它的實現(xiàn)有以下的優(yōu)點.

  • 支持SPDY,允許連接同一主機的所有請求分享一個socket。
  • 如果SPDY不可用,會使用連接池減少請求延遲。
  • 使用GZIP壓縮下載內(nèi)容,且壓縮操作對用戶是透明的。
  • 利用響應(yīng)緩存來避免重復(fù)的網(wǎng)絡(luò)請求。
  • 當(dāng)網(wǎng)絡(luò)出現(xiàn)問題的時候,OKHttp會依然有效,它將從常見的連接問題當(dāng)中恢復(fù)。
  • 如果你的服務(wù)端有多個IP地址,當(dāng)?shù)谝粋€地址連接失敗時,OKHttp會嘗試連接其他的地址,這對IPV4和IPV6以及寄宿在多個數(shù)據(jù)中心的服務(wù)而言,是非常有必要的。

因此使用 OkHttp 作為替代是好的選擇.

  1. 先用 OkHttp 實現(xiàn)一個新的 HurlStack 用于構(gòu)建 Volley 的 requestQueue.

    1. public class OkHttpStack extends HurlStack { 
    2.  
    3.  private OkHttpClient okHttpClient; 
    4.  
    5.  /** 
    6.   * Create a OkHttpStack with default OkHttpClient. 
    7.   */ 
    8.  public OkHttpStack() { 
    9.      this(new OkHttpClient()); 
    10.  } 
    11.  
    12.  /** 
    13.   * Create a OkHttpStack with a custom OkHttpClient 
    14.   * @param okHttpClient Custom OkHttpClient, NonNull 
    15.   */ 
    16.  public OkHttpStack(OkHttpClient okHttpClient) { 
    17.      this.okHttpClient = okHttpClient; 
    18.  } 
    19.  
    20.  @Override 
    21.  protected HttpURLConnection createConnection(URL url) throws IOException { 
    22.      OkUrlFactory okUrlFactory = new OkUrlFactory(okHttpClient); 
    23.      return okUrlFactory.open(url); 
    24.  } 
  2. 然后使用 OkHttpStack 創(chuàng)建新的 Volley requestQueue.

    1. requestQueue = Volley.newRequestQueue(getContext(), new OkHttpStack()); 
    2. requestQueue.start(); 

    這樣就行了.

使用 Https

作為一個有節(jié)操的開發(fā)者應(yīng)該使用 Https 來保護(hù)用戶的數(shù)據(jù), Android 開發(fā)者網(wǎng)站上文章Security with HTTPS and SSL做了詳盡的闡述.

OkHttp 自身是支持 Https 的. 參考文檔 OkHttp Https, 直接使用上面的 OkHttpStack就可以了, 但是如果遇到服務(wù)器開發(fā)哥哥使用了自簽名的證書(不要問我為什么要用自簽名的), 就無法正常訪問了.

網(wǎng)上有很多文章給出的方案是提供一個什么事情都不做的TrustManager 跳過 SSL 的驗證, 這樣做很容受到攻擊, Https 也就形同虛設(shè)了.

我采用的方案是將自簽名的證書打包入 APK 加入信任.

好處:

  • 應(yīng)用難以逆向, 應(yīng)用不再依賴系統(tǒng)的 trust store, 使得 Charles 抓包等工具失效. 要分析應(yīng)用 API 必須反編譯 APK.
  • 不用額外購買證書, 省錢....

缺點:

  • 證書部署靈活性降低, 一旦變更證書必須升級程序.

實現(xiàn)步驟

以最著名的自簽名網(wǎng)站12306為例說明

  1. 導(dǎo)出證書

    1. echo | openssl s_client -connect kyfw.12306.cn:443 2>&1 |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > kyfw.12306.cn.pem 
  2. 將證書轉(zhuǎn)為 bks 格式
    下載最新的bcprov-jdk, 執(zhí)行下面的命令. storepass 是導(dǎo)出密鑰文件的密碼.

    1. keytool -importcert -v \ 
    2.  -trustcacerts \ 
    3.  -alias 0 \ 
    4.  -file <(openssl x509 -in kyfw.12306.cn.pem) \ 
    5.  -keystore $CERTSTORE -storetype BKS \ 
    6.  -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider \ 
    7.  -providerpath ./bcprov-jdk16-1.46.jar \ 
    8.  -storepass asdfqaz 
  3. 將導(dǎo)出的 kyfw.bks 文件放入 res/raw 文件夾下.

  4. 創(chuàng)建 SelfSignSslOkHttpStack

    1. /** 
    2. * A HttpStack implement witch can verify specified self-signed certification. 
    3. */ 
    4. public class SelfSignSslOkHttpStack extends HurlStack { 
    5.  
    6.  private OkHttpClient okHttpClient; 
    7.  
    8.  private Map<String, SSLSocketFactory> socketFactoryMap; 
    9.  
    10.  /** 
    11.   * Create a OkHttpStack with default OkHttpClient. 
    12.   */ 
    13.  public SelfSignSslOkHttpStack(Map<String, SSLSocketFactory> factoryMap) { 
    14.      this(new OkHttpClient(), factoryMap); 
    15.  } 
    16.  
    17.  /** 
    18.   * Create a OkHttpStack with a custom OkHttpClient 
    19.   * @param okHttpClient Custom OkHttpClient, NonNull 
    20.   */ 
    21.  public SelfSignSslOkHttpStack(OkHttpClient okHttpClient, Map<String, SSLSocketFactory> factoryMap) { 
    22.      this.okHttpClient = okHttpClient; 
    23.      this.socketFactoryMap = factoryMap; 
    24.  } 
    25.  
    26.  @Override 
    27.  protected HttpURLConnection createConnection(URL url) throws IOException { 
    28.      if ("https".equals(url.getProtocol()) && socketFactoryMap.containsKey(url.getHost())) { 
    29.          HttpsURLConnection connection = (HttpsURLConnection) new OkUrlFactory(okHttpClient).open(url); 
    30.          connection.setSSLSocketFactory(socketFactoryMap.get(url.getHost())); 
    31.          return connection; 
    32.      } else { 
    33.          return  new OkUrlFactory(okHttpClient).open(url); 
    34.      } 
    35.  } 
  5. 然后用 SelfSignSslOkHttpStack 創(chuàng)建 Volley 的 RequestQueue.

    1. String[] hosts = {"kyfw.12306.cn"}; 
    2.  int[] certRes = {R.raw.kyfw}; 
    3.  String[] certPass = {"asdfqaz"}; 
    4.  socketFactoryMap = new Hashtable<>(hosts.length); 
    5.  
    6.  for (int i = 0; i < certRes.length; i++) { 
    7.      int res = certRes[i]; 
    8.      String password = certPass[i]; 
    9.      SSLSocketFactory sslSocketFactory = createSSLSocketFactory(context, res, password); 
    10.      socketFactoryMap.put(hosts[i], sslSocketFactory); 
    11.  } 
    12.  
    13.  HurlStack stack = new SelfSignSslOkHttpStack(socketFactoryMap); 
    14.  
    15.  requestQueue = Volley.newRequestQueue(context, stack); 
    16.  requestQueue.start(); 
  6. 我們來試一試, 用上一步穿件的 RequestQueue 替換掉原來的, 然后發(fā)請求試試.

    1. StringRequest request = new StringRequest( 
    2.             Request.Method.GET, 
    3.             "https://kyfw.12306.cn/otn/"
    4.             new Response.Listener<String>() { 
    5.                 @Override 
    6.                 public void onResponse(String response) { 
    7.                     responseContentTextView.setText(response); 
    8.                 } 
    9.             }, 
    10.             new Response.ErrorListener() { 
    11.                 @Override 
    12.                 public void onErrorResponse(VolleyError error) { 
    13.                     responseContentTextView.setText(error.toString()); 
    14.                 } 
    15.             }); 
    16.     RequestManager.getInstance(this).addRequest(request, this); 
  7. done

責(zé)任編輯:倪明 來源: 簡書
相關(guān)推薦

2012-05-24 14:58:55

開源代碼

2011-03-11 09:53:46

FacebookMySQL

2017-07-20 13:11:46

Code ReviewPR評審

2024-01-04 08:49:03

Vuescope限制

2016-01-05 16:17:59

云夢數(shù)據(jù)倉

2018-01-08 14:18:14

代碼互聯(lián)網(wǎng)持續(xù)集成

2015-07-22 11:35:26

2022-03-10 11:25:51

InnoDB優(yōu)化

2023-09-27 22:44:18

數(shù)據(jù)遷移數(shù)據(jù)庫

2021-07-07 12:36:10

HTTPSSSL通信

2017-10-25 09:50:51

Linux

2019-09-10 09:25:27

分布式系統(tǒng)Elasticsear

2021-05-13 07:32:17

培訓(xùn)代碼同事

2024-12-04 10:47:26

2016-09-21 10:18:26

阿里Dubbo性能測試

2021-05-05 10:48:33

滲透測試漏洞網(wǎng)絡(luò)攻擊

2022-08-23 14:51:37

網(wǎng)絡(luò)安全領(lǐng)導(dǎo)層存儲

2017-01-12 20:19:37

AndroidContext開發(fā)

2019-08-12 08:57:27

HTTPS HTTP網(wǎng)絡(luò)協(xié)議

2012-11-28 01:47:35

軟件測試測試
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美在线视频一区二区 | 九色在线视频 | 日韩一级免费观看 | 亚洲视频一区二区三区 | 欧美福利久久 | 99视频在线免费观看 | 国产精品久久久久久婷婷天堂 | 狠狠夜夜| 成人夜晚看av | 一级做a爰片性色毛片视频停止 | 最新国产视频 | 精品免费| 永久看片| 久草网址| 国精品一区二区 | 日本爱爱视频 | 成在线人视频免费视频 | 黄页网址在线观看 | 日本一区二区三区在线观看 | 欧美一区二区在线 | 91视频88av| 最新av片 | 精品国产乱码一区二区三区 | 欧美一区二区 | 精品国产青草久久久久福利 | 久久精品国产99国产精品 | 青青草一区二区三区 | 亚洲瑟瑟 | 美女在线一区二区 | 日本一区二区三区免费观看 | 久久一区二区三区四区 | 国产一区 日韩 | 成人久久18免费网站 | 国产精品1区2区3区 一区中文字幕 | 亚州综合一区 | 国产精品日韩 | 97色在线视频 | 久久国产高清 | 国产一区二区三区在线 | 狠狠综合网 | 日韩网 |