OkHttp基本使用

来源:http://www.cnblogs.com/yishaochu/archive/2017/06/09/6972357.html
-Advertisement-
Play Games

OkHttp介紹 Android系統提供了兩種HTTP通信類,HttpURLConnection和HttpClient,HttpURLConnection相對來說比HttpClient難用,google自從2.3版本之後一直推薦使用HttpURLConnection,並且在6.0版本的sdk中直接刪 ...


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'

get請求

首先需要創建一個全局的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();
        }
};
  • 首先創建一個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("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上了,如果你想擴展介面,或者想看源碼都很方便。

源碼下載

伺服器源碼

Android客戶端源碼

如果你想第一時間看我們的後期文章,掃碼關註公眾號,每周不定期推送Android開發實戰教程文章,你還等什麼,趕快關註吧。

      Android開發666 - 安卓開發技術分享
            掃描二維碼加關註

Android開發666


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 瞭解這一章節,需要先瞭解LayoutInflater這個工具類,我以前分析過:http://www.cnblogs.com/kezhuang/p/6978783.html Window是Activity類中的一個全局變數,Window的作用是輔助Activity(也有可能是其他組件,本章拿Activ ...
  • LayoutInflater是用來解析XML佈局文件,然後生成對象的ViewTree的工具類。是這個工具類的存在,才能讓我們寫起Layout來那麼省勁。 我們接下來進去刨析,看看裡邊的奧秘 我們在使用這個類的時候,通常都是像上面這樣寫,首先通過from函數獲取對象,在調用inflate方法,來生成相 ...
  • Android中整個的View的組裝是採用組合模式。 ViewGroup就相當與樹根,各種Layout就相當於枝幹,各種子View,就相當於樹葉。 至於View類。我們就當它是個種子吧。哈哈! ViewGroup屬於樹根,可以生長數很多枝幹(繼承自定義Layout)而枝幹上有可以長出很多葉子(Tex ...
  • Runtime學習 應用源碼學習   Runtime源碼分析,帶你瞭解OC實現過程。其中參考了大量的大神的代碼以及文獻,裡面也有個人的見解,歡迎拍磚,歡迎交流。 兩種常見使用場景 根據調試信息,發現兩者的區別是: 第一種進入到 第二種繞一個遠路,先初始化 兩者最終進入到如下方法 ...
  • Android實現定時任務一般會使用以上(Handler Timer Thread AlarmManager CountDownTimer)五種方式。當然還有很多組合使用(比如Handler+Thread 比如Handler類自帶的postDelyed 比如Handler+Timer+TimerTa ...
  • 簡單的說,就是當dispatchTouchEvent在進行事件分發的時候,只有前一個事件(如ACTION_DOWN)返回true,才會收到ACTION_MOVE和ACTION_UP的事件。 dispatchTouchEvent 和 onTouchEvent 可以通過return true 消費事件, ...
  • 在WWDC 2017開發者大會上,蘋果宣佈了一系列新的面向開發者的機器學習 API,包括面部識別的視覺 API、自然語言處理 API,這些 API 集成了蘋果所謂的 Core ML 框架。Core ML 的核心是加速在 iPhone、iPad、Apple Watch 上的人工智慧任務,支持深度神經網 ...
  • iOS CAEmitterLayer 實現粒子發射動畫效果 效果圖 代碼已上傳 GitHub:https://github.com/Silence GitHub/CoreAnimationDemo 動畫效果用 CAEmitterLayer 實現。CAEmitterLayer 顯示粒子發射動畫,具體的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...