一.安裝

二.用法
(一)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