Android系統提供了兩種HTTP通訊類,HttpURLConnection和HttpClient,HttpURLConnection相對來講比HttpClient難用,google自從2.3版本以後一直推薦使用HttpURLConnection,而且在6.0版本的sdk中直接刪掉了HttpClient類。java
可是, 上面兩個類庫和OkHttp比起來就弱爆了, 由於OkHttp不只具備高效的請求效率,而且節省寬帶, 還提供了不少開箱即用的網絡疑難雜症解決方案.(聽說Android4.4的源碼中能夠看到OkHttp替換了HttpURLConnection)git
前面的內容介紹了OkHttp,本章就來教你們okhttp的基本使用,學了這些基本東西以後,你們有其餘的需求能夠自行擴展。如下的全部請求都是異步請求服務器,在真實的企業開發中,基本都是異步。github
Android Studio能夠在線依賴,在app/build.gradle文件中加上下面這句話就行web
compile 'com.squareup.okhttp3:okhttp:3.8.0'
首先須要建立一個全局的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(); } };
handler的代碼很簡單,就是把請求的結果顯示在TextView上緩存
private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { String result= (String) msg.obj; tvResult.setText(result); } };
經過調用登陸接口發送一個post請求。跟get不同的地方就是傳參數不同,post請求須要把參數封裝到RequestBody對象,調用Request對象的post方法把RequestBody傳入進去。最後調用execute方法執行請求,這個方法前面get請求的時候講過。tomcat
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上了,若是你想擴展接口,或者想看源碼都很方便。