OkHttp基本使用

  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'
  
  1
  
  1
  
  get請求
  
  首先須要建立一個全局的OkHttpClient對象,全部的Http請求都共用這個對象就行。
  
  private OkHttpClient client = new OkHttpClient();
  
  1
  
  1
  
  通常從服務器獲取信息的接口都是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(http://www.acnet.cn/"username", "ansen");//表單參數
  
  builder.addFormDataPart(www.sb45475.com "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_http://www.22yigouyule.cn/ file", "ansen.txt",RequestBody.create(mediaType,bytes));
  
  RequestBody requestBody = builder.build();
  
  Request.Builder requestBuider = new Request.Builder(www.22yigouyule.cn/);
  
  requestBuider.url("http://139.196.huazongyulept.cn 35.30:8080/OkHttpTest/uploadFile.do");
  
  requestBuider.post(requestBody);
  
  execute(requestBuider);
  
  如何證實文件有上傳到服務器呢?打開瀏覽器,輸入下面這個地址,就能看到文件內容了。若是是本地服務器記得把139.196.35.30改爲localhost。
  
  http://139.196.35.30:8080/http://xucaizxyl.com/ OkHttpTest/upload/ansen.txt
  
  1
  
  1
  
  經過http協議請求服務器數據,經常使用的就這幾種請求,若是有特殊需求本身擴展。例如:下載文件,從服務器下載圖片等。。。。
  
  服務器接口
  
  這三個接口的服務器代碼是我本身用Java web寫的,開發工具用的是IntelliJ IDEA,服務器是tomcat,我部署在雲上了,139.196.35.30是個人云服務器的外網ip,你們測試也方便。服務器代碼我放github上了,若是你想擴展接口,或者想看源碼都很方便。
  
  源碼下載
  
  服務器源碼
  
  Android客戶端源碼git

相關文章
相關標籤/搜索