❶ okhttp使用中自己要處理哪些錯誤和異常
OkHttp是一個相對成熟的解決方案,據說android4.4的源碼中可以看到HttpURLConnection已經替換成OkHttp實現了。所以我們更有理由相信OkHttp的強大。
OkHttp 處理了很多網路疑難雜症:會從很多常用的連接問題中自動恢復。如果您的伺服器配置了多個IP地址,當第一個IP連接失敗的時候,OkHttp會自動嘗試下一個IP。OkHttp還處理了代理伺服器問題和SSL握手失敗問題。
使用 OkHttp 無需重寫您程序中的網路代碼。OkHttp實現了幾乎和java.net.HttpURLConnection一樣的API。如果你用了 Apache HttpClient,則OkHttp也提供了一個對應的okhttp-apache 模塊。
❷ Okhttp 使用詳解
一個最簡單的OkHttpClient
一個復雜點的OkHttpClient配置
具體可配置參數見OkHttpClient.Builder類,幾點注意事項:
兩種攔截器的區別
官方提供的Logging Interceptor
地址: https://github.com/victorfan336/okhttp-logging-interceptor
gradle.build中添加依賴:
compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
通過Request.Builder創建請求,默認是Get請求
主要是構建RequestBody,並設置Content-Type消息頭。
1.普通Post請求
比如json請求
2. 使用FormBody傳遞鍵值對參數
Content-Type: application/x-www-form-urlencoded
比如:
3. 使用RequestBody傳遞Json或File對象
4. 使用MultipartBody同時傳遞鍵值對參數和File對象
5. 使用MultipartBody提交分塊請求
6. 自定義RequestBody實現流的上傳
1、同步執行
由於android強制要求網路請求在線程中執行,所以無法使用execute
2、非同步執行
1. 設置請求頭
2. 設置超時
3. 設置緩存
1、對於Get請求,如果請求參數較多,自己拼接Url較為麻煩
比如
拼接結果: http://www..com/user/login/username=zhangsan&password=123456
如果能做一些封裝,直接addParam(key,value)的形式則會簡單很多。
2、Callback在子線程中回調,大部分時候,我們都是需要更新UI的,還需自己post到主線程中處理。
3、構建請求步驟比較多
因此,Square提供了針對OkHttp的封裝庫Retrofit,另外Github上也有很多第三方的封裝庫,比如OkGo。
❸ Android使用OkHttp請求自簽名的https網站
很多公司考慮到安全問題,項目中都採用https加密協議進行數據傳輸。但是一些公司又不想花一筆錢去CA申請證書,所以就採用自簽名的證書。
OkHttp默認是可以訪問通過CA認證的HTTPS鏈接,例如網路首頁也是https鏈接( https://www..com/ )。 但是如果是你們公司自簽名(即自己用keytool生成的證書,而不是採用通過CA認證的證書)的伺服器,OkHttp是無法訪問的,例如訪問12306網站( https://kyfw.12306.cn/otn/ ) ,會報如下錯誤:
HTTPS在傳輸數據之前需要客戶端(瀏覽器)與服務端(網站)之間進行一次握手,在握手過程中將確立雙方加密傳輸數據的密碼信息。握手過程的簡單描述如下:
握手過程中如果有任何錯誤,都會使加密連接斷開,從而阻止了隱私信息的傳輸。
以下我們使用12306網站為例
注意:別忘了加許可權和依賴okhttp庫
Demo地址: https://github.com/wildma/okhttps
參考博客: http://blog.csdn.Net/lmj623565791/article/details/48129405
❹ Android通過OKhttp從伺服器端獲取數據
①簡單的異棚洞步Get請求
第一步,創建OKHttpClient對象
第二步,創建Request請求
第三步,創建一個Call對象
第四步,將請求添大和賀加到調度中
不多說,直接上代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//okHttp的基本使用 --- get方法
String url = "https://api.douban.com/v2/movie/top250?start=0&count=10";
//1,創建OKHttpClient對象
OkHttpClient mOkHttpClient = new OkHttpClient();
//2,創建一個Request
Request request = new Request.Builder().url(url).build();
//3,創建一個call對象
Call call = mOkHttpClient.newCall(request);
//4,將請求添加到調滾派度中
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
if (response.isSuccessful()) {
final String message = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
tv_message.setText(message);
progressBar.setVisibility(View.GONE);
}
});
}
}
});
❺ Android Okhttp/Retrofit網路請求加解密實現方案
比較安全的方案應該是AES+RSA的加密方式。具體如下圖所示。
為什麼要這樣做呢?
1、RSA是非對稱加密,公鑰和私鑰分開,且公鑰可以公開,很適合網路數據傳輸場景。但RSA加密比較慢,據說比AES慢100倍,且對加密的數據長度也有限制。
2、AES是對稱加密,加密速度快,安全性高,但密鑰的保存是個問題,在網路數據傳輸的場景就很容易由於密鑰泄露造成安全隱患
3、所以,AES+RSA結合才更好,AES加密數據,且密鑰隨機生成,RSA用對方(伺服器)的公鑰加密隨機生成的AES密鑰。傳輸時要把密文,加密的AES密鑰和自己的公鑰傳給對方(伺服器)。對方(伺服器)接到數據後,用自己的私鑰解密AES密鑰,再拿AES密鑰解密數據得到明文。這樣就綜合了兩種加密體系的優點。
4、除上面說的外,還可以加簽名,即對傳輸的數據(加密前)先做個哈希,然後用自己的RSA私鑰對哈希簽名(對方拿到自己的公鑰可以驗簽),這樣可以驗證傳輸內容有沒有被修改過。
就java來說,加密的輸入和輸出都是位元組數組類型的,也就是二進制數據,網路傳輸或本地保存都需要重新編碼為字元串。推薦使用Base64。Android 有自帶的Base64實現,flag要選Base64.NO_WRAP,不然末尾會有換行影響服務端解碼。
Android中Base64加密
總而言之,這些不同語言都有實現庫,調用即可,關鍵是參數要一致,具體還需要和後台聯調一下。
rsa加解密的內容超長的問題解決
現在說到網路框架,應該毫無疑問是Retrofit了。上面說的加密方案說到底還是要在網路請求框架內加上,怎麼做入侵最小,怎麼做最方便才是重點。
1、坑定不能直接在介面調用層做加密,加參數,這樣每個介面都要修改,這是不可能的。
2、ConverterFactory處理,這也是網上可以搜到的很多文章的寫法,但我覺得還是有入侵。而且有點麻煩。
3、OkHttp添加攔截器,這種方法入侵最小(可以說沒有),實現呢也非常優雅。
下面的實現,網上也找不到多少可以參考的文章,但不得不說,OkHttp的封裝和設計真的很好用,所見即所得。看下源碼,就知道該怎麼用了,連文檔都不用查。
主要注意點:
0、和介面無關的新加的數據放在請求頭里。
1、該close的要close,不然會內存泄漏。
2、新舊Request和Response要區分好,新的要替換舊的去傳遞或返回。
3、要對response.code()做處理,只有在和後台約定好的返回碼下才走解密的邏輯,具體看自己的需求,不一定都是200。