OkHttp介紹 Android系統提供了兩種HTTP通信類,HttpURLConnection和HttpClient,HttpURLConnection相對來說比HttpClient難用,google自從2.3版本之後一直推薦使用HttpURLConnection,並且在6.0版本的sdk中直接刪 ...
OkHttp介紹
Android系統提供了兩種HTTP通信類,HttpURLConnection和HttpClient,HttpURLConnection相對來說比HttpClient難用,google自從2.3版本之後一直推薦使用HttpURLConnection,並且在6.0版本的sdk中直接刪掉了HttpClient類。
但是, 上面兩個類庫和OkHttp比起來就弱爆了, 因為OkHttp不僅具有高效的請求效率,並且節省寬頻, 還提供了很多開箱即用的網路疑難雜症解決方案.(據說Android4.4的源碼中可以看到OkHttp替換了HttpURLConnection)
- 支持HTTP/2, HTTP/2通過使用多路復用技術在一個單獨的TCP連接上支持併發, 通過在一個連接上一次性發送多個請求來發送或接收數據
- 如果HTTP/2不可用, 連接池減少請求延遲
- 支持GZIP, 可以壓縮下載體積
- 響應緩存可以避免重覆請求網路
- 會從很多常用的連接問題中自動恢復,如果您的伺服器配置了多個IP地址,當第一個IP連接失敗的時候,OkHttp會自動嘗試下一個IP
- OkHttp還處理了代理伺服器問題和SSL握手失敗問題
OkHttp基本使用
概述
前面的內容介紹了OkHttp,本章就來教大家okhttp的基本使用,學了這些基本東西之後,大家有其他的需求可以自行擴展。以下的所有請求都是非同步請求伺服器,在真實的企業開發中,基本都是非同步。
- get請求
- post請求
- 文件上傳
依賴
Android Studio可以線上依賴,在app/build.gradle文件中加上下麵這句話就行
compile 'com.squareup.okhttp3:okhttp:3.8.0'
get請求
首先需要創建一個全局的OkHttpClient對象,所有的Http請求都共用這個對象就行。
private OkHttpClient client = new OkHttpClient();
一般從伺服器獲取信息的介面都是get請求,這裡我們調用獲取用戶信息介面。
private void getUserInfo(){
//創建一個Request
Request.Builder builder = new Request.Builder().url("http://139.196.35.30:8080/OkHttpTest/getUserInfo.do");
execute(builder);
}
//執行請求
private void execute(Request.Builder builder){
Call call = client.newCall(builder.build());
call.enqueue(callback);//加入調度隊列
}
//請求回調
private Callback callback=new Callback(){
@Override
public void onFailure(Call call, IOException e) {
Log.i("MainActivity","onFailure");
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//從response從獲取伺服器返回的數據,轉成字元串處理
String str = new String(response.body().bytes(),"utf-8");
Log.i("MainActivity","onResponse:"+str);
//通過handler更新UI
Message message=handler.obtainMessage();
message.obj=str;
message.sendToTarget();
}
};
- 首先創建一個request對象,通過request設置請求url,通過這個類還可以設置更多的請求信息。
- 然後通過Request去構造一個Call對象。
- 調用enqueue執行非同步請求,有一個參數設置回調。請求成功或者失敗會調用Callback介面的onResponse跟onFailure方法,因為這是非同步請求,在回調方法中是不能直接更新UI,所以我們需要通過Handler去更新UI。
handler的代碼很簡單,就是把請求的結果顯示在TextView上
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
String result= (String) msg.obj;
tvResult.setText(result);
}
};
Post請求
通過調用登錄介面發送一個post請求。跟get不一樣的地方就是傳參數不一樣,post請求需要把參數封裝到RequestBody對象,調用Request對象的post方法把RequestBody傳入進去。最後調用execute方法執行請求,這個方法前面get請求的時候講過。
private void login(){
//把請求參數封裝到RequestBody裡面
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("username","ansen");//請求參數一
formBuilder.add("password","123");//請求參數二
RequestBody requestBody = formBuilder.build();
Request.Builder builder = new Request.Builder().url("http://139.196.35.30:8080/OkHttpTest/login.do").post(requestBody);
execute(builder);
}
文件上傳
上傳文件需要用到MultipartBody對象,通過調用addFormDataPart方法添加表單參數,通過setType方法設置內容類型,這邊設置form表單類型,調用自己的getUploadFileBytes方法獲取文件byte數組,通過addFormDataPart方法添加文件,後面的流程跟之前的post請求一樣。
private void uploadFile(){
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.addFormDataPart("username", "ansen");//表單參數
builder.addFormDataPart("password", "123456");//表單參數
builder.setType(MultipartBody.FORM);
MediaType mediaType = MediaType.parse("application/octet-stream");
byte[] bytes=getUploadFileBytes();//獲取文件內容存入byte數組
//上傳文件 參數1:name 參數2:文件名稱 參數3:文件byte數組
builder.addFormDataPart("upload_file", "ansen.txt",RequestBody.create(mediaType,bytes));
RequestBody requestBody = builder.build();
Request.Builder requestBuider = new Request.Builder();
requestBuider.url("http://139.196.35.30:8080/OkHttpTest/uploadFile.do");
requestBuider.post(requestBody);
execute(requestBuider);
}
如何證明文件有上傳到伺服器呢?打開瀏覽器,輸入下麵這個地址,就能看到文件內容了。如果是本地伺服器記得把139.196.35.30改成localhost。
http://139.196.35.30:8080/OkHttpTest/upload/ansen.txt
通過http協議請求伺服器數據,常用的就這幾種請求,如果有特殊需求自己擴展。例如:下載文件,從伺服器下載圖片等。。。。
伺服器介面
這三個介面的伺服器代碼是我自己用java web寫的,開發工具用的是IntelliJ IDEA,伺服器是tomcat,我部署在雲上了,139.196.35.30是我的雲伺服器的外網ip,大家測試也方便。伺服器代碼我放github上了,如果你想擴展介面,或者想看源碼都很方便。
源碼下載
如果你想第一時間看我們的後期文章,掃碼關註公眾號,每周不定期推送Android開發實戰教程文章,你還等什麼,趕快關註吧。
Android開發666 - 安卓開發技術分享
掃描二維碼加關註