android OKHttp的基本使用详解
今天,簡單講講Android里如何使用OKHttp。
?
Android框架系列:
一.android EventBus的簡單使用
二.android Glide簡單使用
三.android OKHttp的基本使用詳解
?
簡單說一下學習okhttp的理由
一,OKHttp介紹
okhttp是一個第三方類庫,用于android中請求網絡。
這是一個開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso和LeakCanary) 。用于替代HttpUrlConnection和Apache HttpClient(android API23 里已移除HttpClient)。
okhttp有自己的官網,官網網址:OKHttp官網
如果想了解原碼可以在github上下載,地址是:https://github.com/square/okhttp
在AndroidStudio中使用不需要下載jar包,直接添加依賴即可:
compile ‘com.squareup.okhttp3:okhttp:3.4.1’
下面對以OKHttp3來詳細介紹OKHttp的使用方法。
二,get請求的使用方法
使用OKHttp進行網絡請求支持兩種方式,一種是同步請求,一種是異步請求。下面分情況進行介紹。
1,get的同步請求
對于同步請求在請求時需要開啟子線程,請求成功后需要跳轉到UI線程修改UI。
在AndroidManifest.xml添加所需權限
<uses-permission android:name="android.permission.INTERNET" />
使用示例如下:
此時打印結果如下:
response.code()==200;
response.message()==OK;
res=={“code”:200,”message”:success};
注意事項:
1,Response.code是http響應行中的code,如果訪問成功則返回200.這個不是服務器設置的,而是http協議中自帶的。res中的code才是服務器設置的。注意二者的區別。
2,response.body().string()本質是輸入流的讀操作,所以它還是網絡請求的一部分,所以這行代碼必須放在子線程。
3,response.body().string()只能調用一次,在第一次時有返回值,第二次再調用時將會返回null。原因是:response.body().string()的本質是輸入流的讀操作,必須有服務器的輸出流的寫操作時客戶端的讀操作才能得到數據。而服務器的寫操作只執行一次,所以客戶端的讀操作也只能執行一次,第二次將返回null。
?
2,get的異步請求
這種方式不用再次開啟子線程,但回調方法是執行在子線程中,所以在更新UI時還要跳轉到UI線程中。
使用示例如下:
異步請求的打印結果與注意事項與同步請求時相同。最大的不同點就是異步請求不需要開啟子線程,enqueue方法會自動將網絡請求部分放入子線程中執行。
注意事項:
1,回調接口的onFailure方法和onResponse執行在子線程。
2,response.body().string()方法也必須放在子線程中。當執行這行代碼得到結果后,再跳轉到UI線程修改UI。
?
三,post請求的使用方法
Post請求也分同步和異步兩種方式,同步與異步的區別和get方法類似,所以此時只講解post異步請求的使用方法。
使用示例如下:
看完代碼我們會發現:post請求中并沒有設置請求方式為POST,回憶在get請求中也沒有設置請求方式為GET,那么是怎么區分請求方式的呢?重點是Request.Builder類的post方法,在Request.Builder對象創建最初默認是get請求,所以在get請求中不需要設置請求方式,當調用post方法時把請求方式修改為POST。所以此時為POST請求。
?
四,POST請求傳遞參數的方法總結
在post請求使用方法中講了一種傳遞參數的方法,就是創建表單請求體對象,然后把表單請求體對象作為post方法的參數。post請求傳遞參數的方法還有很多種,但都是通過post方法傳遞的。下面我們看一下Request.Builder類的post方法的聲明:
public Builder post(RequestBody body)由方法的聲明可以看出,post方法接收的參數是RequestBody 對象,所以只要是RequestBody 類以及子類對象都可以當作參數進行傳遞。FormBody就是RequestBody 的一個子類對象。
1,使用FormBody傳遞鍵值對參數
這種方式用來上傳String類型的鍵值對
使用示例如下:
2,使用RequestBody傳遞Json或File對象
RequestBody是抽象類,故不能直接使用,但是他有靜態方法create,使用這個方法可以得到RequestBody對象。
這種方式可以上傳Json對象或File對象。
上傳json對象使用示例如下:
上傳File對象使用示例如下:
OkHttpClient client = new OkHttpClient();//創建OkHttpClient對象。 MediaType fileType = MediaType.parse("File/*");//數據類型為json格式, File file = new File("path");//file對象. RequestBody body = RequestBody.create(fileType , file ); Request request = new Request.Builder().url("http://www.baidu.com").post(body).build(); client.newCall(request).enqueue(new Callback() {。。。});//此處省略回調方法。3,使用MultipartBody同時傳遞鍵值對參數和File對象
這個字面意思是多重的body。我們知道FromBody傳遞的是字符串型的鍵值對,RequestBody傳遞的是多媒體,那么如果我們想二者都傳遞怎么辦?此時就需要使用MultipartBody類。
使用示例如下:
4,自定義RequestBody實現流的上傳
在上面的分析中我們知道,只要是RequestBody類以及子類都可以作為post方法的參數,下面我們就自定義一個類,繼承RequestBody,實現流的上傳。
使用示例如下:
首先創建一個RequestBody類的子類對象:
然后使用body對象:
OkHttpClient client = new OkHttpClient();//創建OkHttpClient對象。 Request request = new Request.Builder().url("http://www.baidu.com").post(body).build(); client.newCall(request).enqueue(new Callback() {。。。});以上代碼的與眾不同就是body對象,這個body對象重寫了write方法,里面有個sink對象。這個是OKio包中的輸出流,有write方法。使用這個方法我們可以實現上傳流的功能。
使用RequestBody上傳文件時,并沒有實現斷點續傳的功能。我可以使用這種方法結合RandomAccessFile類實現斷點續傳的功能。
?
五,設置請求頭
OKHttp中設置請求頭特別簡單,在創建request對象時調用一個方法即可。
使用示例如下:
其他部分代碼略。
六,下載文件
在OKHttp中并沒有提供下載文件的功能,但是在Response中可以獲取流對象,有了流對象我們就可以自己實現文件的下載。代碼如下:
這段代碼寫在回調接口CallBack的onResponse方法中:
?
超時設置,整個程序應使用這一個mOkHttpClient對象
public static void setTimeout() {mOkHttpClient.newBuilder().connectTimeout(10, TimeUnit.SECONDS)//10秒連接超時.writeTimeout(10, TimeUnit.SECONDS)//10m秒寫入超時.readTimeout(10, TimeUnit.SECONDS)//10秒讀取超時.build(); }簡單回顧一下,okhttp可以使用
private void getDataAsync() {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("http://www.baidu.com").build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {if(response.isSuccessful()){//回調的方法執行在子線程。Log.d("kwwl","獲取數據成功了");Log.d("kwwl","response.code()=="+response.code());Log.d("kwwl","response.body().string()=="+response.body().string());}}}); }發生請求,同時指出Get和POST兩種請求方式,結果在Callback里回調回來,記住是子線程,所以不能再回調修改UI.還有文件上傳和下載也比較簡單,具體的代碼大家自己去看。
?
這里提供我學習時寫的OKHttp的Demo:源碼下載
?
android OKHttp的基本使用詳解就講完了。
?
就這么簡單。
總結
以上是生活随笔為你收集整理的android OKHttp的基本使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android Glide简单使用
- 下一篇: android RxJava(RxAnd