淺談Android studio中OKHttp安裝及簡單使用


Google貌似在6.0版本里面刪除了HttpClient相關API,鑒於okhttp的口碑相當好,介紹一下OKHttp的安裝及使用:

一.安裝

對於 Android Studio的用戶,在Project Structure--->Dependencies 點擊“+”號選Library dependency在搜索頁面分別搜okttp,okio
注:okhttp內部依賴okio,別忘了同時導入okio
 
 

二.用法

(一)Http Get  Http Post 

//創建okHttpClient對象,設置超時

1 OkHttpClient mOKHttpClient = new OkHttpClient.Builder()
2         .connectTimeout(10, TimeUnit.SECONDS)
3         .readTimeout(10, TimeUnit.SECONDS)
4         .build();


get、post請求除了請求體和請求方法不同,其他設置是相同的

首先說一下2.x到3.x關於POST請求的請求體類的改變:

在2.x中是 類名是:FormEncodingBuilder() 

使用FormEncodingBuilder builder = new FormEncodingBuilder();  
builder.add("username","name");

在3.x中是 類名是: FormBody,但是一般使用是 RequestBody requestBodyPost = new FormBody.Builder()

需要說明一下FormBody是RequestBody的子類

 

 本文采用3.x版本

1 //    請求參數:page=1&code=news&pageSize=20&parentid=0&type=1
2                 RequestBody requestBodyPost = new FormBody.Builder()
3                         .add("page", "1")
4                         .add("code", "news")
5                         .add("pageSize", "20")
6                         .add("parentid", "0")
7                         .add("type", "1")
8                         .build();

 

 默認請求方法是get方法,.get()可以省略

1 Request request = new Request.Builder()
2                         .get()
3                         .url(GET_URL)
4                         .build();
5 Request requestPost = new Request.Builder()
6                         .url(POST_URL)
7                         .post(requestBodyPost)
8                         .build();

然后通過request的對象去構造得到一個Call對象

 1 //new call
 2 Call call = mOkHttpClient.newCall(request); 
 3 //請求加入調度
 4 call.enqueue(new Callback()
 5         {
 6             @Override
 7             public void onFailure(Request request, IOException e)
 8             {
 9             }
10 
11             @Override
12             public void onResponse(final Response response) throws IOException
13             {
14                     //String htmlStr =  response.body().string();
15             }
16         });             

 

需要注意幾點:

  • onResponse回調的參數是response,一般情況下,比如我們希望獲得返回的字符串,可以通過response.body().string()獲取;如果希望獲得返回的二進制字節數組,則調用response.body().bytes();如果你想拿到返回的inputStream,則調用response.body().byteStream()

  • onResponse執行的線程並不是UI線程,如果你希望操作控件,還是需要使用handler,runOnUiThread等操作ui

(二)基於Http的文件上傳

上傳文件和一般的帶參數post請求不同之處在於RequestBody的構建

RequestBody的Builder和type因版本而已,2.x叫做MultipartBuilder,3.x叫做MultipartBody.Builder()。當我們需要做類似於表單上傳的時候,就可以使用它來構造我們的requestBody。此處以3.x為例

 1 File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");
 2 if (!file.exists()) {
 3                     Toast.makeText(MainActivity.this, "文件不存在", Toast.LENGTH_SHORT).show();
 4                 } else {
 5 RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
 6 /* 2.x版本
 7 RequestBody requestBody = new MultipartBuilder()
 8          .type(MultipartBuilder.FORM)*/
 9 RequestBody requestBody = new MultipartBody.Builder()
10         .setType(MultipartBody.FORM)
11      .addPart(Headers.of(
12           "Content-Disposition", 
13               "form-data; name=\"username\""), 
14           RequestBody.create(null, "cxc"))
15     /* .addPart(Headers.of(
16          "Content-Disposition", 
17          "form-data; name=\"mFile\"; 
18          filename=\"wjd.mp4\""), fileBody)*/
19 .addFormDataPart("mFile", file.getName(), fileBody)
20 .addFormDataPart("thumb", file.getName(),
21                 RequestBody.create(MediaType.parse("image/*"), file));
22 //添加其他參數
23 .addFormDataPart(key, value);
24      .build();
25 ·····}

 

說明:

提交json數據,MediaType.parse("application/json; charset=utf-8")

上傳圖片,MediaType.parse("image/*");

提交String,MediaType.parse("text/x-markdown; charset=utf-8")

上傳文件,MediaType.parse("application/octet-stream")

addPart和addFormDataPart方法本質是一樣的

通過上面設置上傳圖片,MP3,小的文件都沒問題。

本文為博主原創文章,請尊重版權,未經博主允許不得轉載,轉載請注明出處:http://www.cnblogs.com/details-666/p/OKHttp.html

帶有進度監聽的上傳下載請參考http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0904/3416.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM