• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • OkHttp3詳解

    OkHttp3 官網 & website

    1.Http協議簡介

    客戶端向服務器發送一個Request,服務端收到Request并進行一系列的處理,返回給客戶端一個Response
    這里寫圖片描述

    Http狀態碼簡介(code為三位數)
    1xx(臨時響應) 2xx (成功)3xx (重定向) 4xx(請求錯誤)5xx(服務器錯誤)

    2.快速使用(AndroidStudio)

    ①添加依賴 compile ‘com.squareup.okhttp3:okhttp:3.8.1’
    ②添加網絡權限
    ③GET請求

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e(TAG, "onFailure: "+ e.getLocalizedMessage());
            }
    
            @Override
            public void onResponse(Call call, Response response) throws IOException {
    
                String result = response.body().string();
                Log.e(TAG, "onResponse: "+result);
    
    
                // 用完關閉資源
                if (response.body()!=null){
                    response.body().close();
                }
             }
         });

    ④Response里有這么兩個方法

        // response.isSuccessful();是否連接成功 狀態碼2xx
        // response.isRedirect();是否重定向 狀態碼3xx

    ⑤Post請求(form表單)

        OkHttpClient client = new OkHttpClient();
    
        // post請求需要傳入一個RequestBody對象
        // 直接點進去RequestBody,通過查看源碼發現RequestBody是個抽象類
        // RequestBody右鍵-->Go To-->Implementation(s)
        // 發現有兩個具體實現類 FormBody(表單) MultiparBody(多種提交方式包括表單、文件等)
        RequestBody body;
    
        body = new FormBody.Builder().add("phone","12345678900").build();
    
        Request request = new Request.Builder().url(postPath).post(body).build();
        client.newCall(request).enqueue(new Callback() {
    
            @Override
            public void onFailure(Call call, IOException e) {
    
            }
    
            @Override
            public void onResponse(Call call, Response response) throws IOException {
    
        });

    ⑥Post(json形式)

        OkHttpClient client = new OkHttpClient();
    
        // json字符串  {"phone":"1234678900"}
        String jsonParams = new Gson().toJson(new Phone("1234678900"));
    
        RequestBody body = RequestBody.create(MediaType.parse("application/json"),jsonParams);
    
        Request request = new Request.Builder().url(postPath).post(body).build();
        client.newCall(request).enqueue(new Callback() {
    
            @Override
            public void onFailure(Call call, IOException e) {
    
            }
    
            @Override
            }
        });

    ⑦文件上傳(表單形式上傳文字和圖片)

        OkHttpClient client = new OkHttpClient();
    
        String basePath = Environment.getExternalStorageDirectory().getAbsolutePath();
    
        RequestBody fileBody1 = RequestBody.create(MediaType.parse("image/png"),new File(basePath+"img1.png"));
        RequestBody fileBody2 = RequestBody.create(MediaType.parse("image/png"),new File(basePath+"img2.png"));
    
        // .addFormDataPart("idcard_front_img","1",fileBody1)
        // 此處傳"1",可能會在后臺生成圖片名.1這種形式的文件
        // 為了便于管理可以寫成addFormDataPart("idcard_front_img","png",fileBody1)
        // 傳null可能會導致調用fail方法
        RequestBody body = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("idcard_no","130233199560509xxxx")
            .addFormDataPart("idcard_front_img","1",fileBody1)
            .addFormDataPart("idcard_behind_img","2",fileBody2)
            .build();
    
        Request request = new Request.Builder().url(imgPostPath).post(body).build();
        client.newCall(request).enqueue(new Callback() {
    
            @Override
            public void onFailure(Call call, IOException e) {
    
            }
    
            @Override
            public void onResponse(Call call, Response response) throws IOException {
    
                Log.d(TAG,"上傳成功");
            }
        });

    ⑧文件下載

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(downLoadPath).build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
    
            }
    
            @Override
            public void onResponse(Call call, Response response) throws IOException {
    
                InputStream is = null;
                FileOutputStream fos = null;
    
                is = response.body().byteStream();
                fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"xxx.apk"));
    
                byte[] b = new byte[1024];
                int len = 0;
    
                while ((len = is.read(b))!=-1){
                    fos.write(b,0,len);
                    fos.flush();
                }
    
                is.close();
                fos.close();
            }
        });

    ⑨源碼與效果 點我下載源碼

    這里寫圖片描述

    版權聲明:本文為Konfyt_Android原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/Konfyt_Android/article/details/77832996

    智能推薦

    OkHttp3源碼分析

    基本使用 從使用方法出發,首先是怎么使用,其次是我們使用的功能在內部是如何實現的.建議大家下載 OkHttp 源碼之后,跟著本文,過一遍源碼。 官方博客栗子:http://square.github.io/okhttp/#examples Request、Response、Call 基本概念 上面的代碼中涉及到幾個常用的類:Request、Response和Call。下面分別介紹: Request...

    OKHttp3源碼解析

    鑒于一些關于OKHttp3源碼的解析文檔過于碎片化,本文系統的,由淺入深得,按照網絡請求發起的流程順序來講解OkHttp3的源碼。在自己學習的同時,給大家分享一些經驗。 主要架構和流程 OKHttpClient、Call OKHttp3在項目中發起網絡請求的API如下: OKHttpClient類: OKHttpClient 里面組合了很多的類對象。其實是將OKHttp的很多功能模塊,全部包裝進這...

    OkHttp3 框架學習

    1.Okhttp介紹 android網絡框架Okhttp,是輕量級框架,由移動支付Square公司貢獻 優點: 允許連接到同一個主機地址的所有請求,提高請求效率 共享Socket,減少對服務器的請求次數 通過連接池,減少了請求延遲 緩存響應數據來減少重復的網絡請求 減少了對數據流量的消耗 自動處理GZip壓縮 功能: get,post請求 文件的上傳下載 加載圖片 支持請求回調,直接返回對象、對象...

    OkHttp3源碼分析

    本文已授權「玉剛說」微信公眾號獨家發布 前言 平常開發Android App的時候,經常用到OkHttp,不能只停留在會用的階段,還要知道其原理。今天就來分析一下OkHttp3的源碼。 基本用法 以post請求為例,基本用法如下: 可以看到大致分四步: 1、構建OkHttpClient對象; 2、構建Request請求對象; 3、構建Call對象; 4、發起請求; 下面一步一步分析 源碼分析 1、...

    okhttp3 Cache回顧

    先回顧一下HTTP的相關知識 HTTP response status codes 200 - 請求成功 301 - 資源(網頁等)被永久轉移到其它URL 404 - 請求的資源(網頁等)不存在 500 - 內部服務器錯誤 1** 信息,服務器收到請求,需要請求者繼續執行操作 2** 成功,操作被成功接收并處理 3** 重定向,需要進一步的操作以完成請求 4** 客戶端錯誤,請求包含語法錯誤或無法...

    猜你喜歡

    okhttp3 源碼分析

    總體流程 下面的流程圖是由上面的文章抄來的(自己畫的圖,用的visio) 整個流程是,通過OkHttpClient將構建的Request轉換為Call,然后在RealCall中進行異步或同步任務,最后通過一些的攔截器interceptor發出網絡請求和得到返回的response。 將流程大概是這么個流程,大家可以有個大概的印象,繼續向下看: 為了讓大家有更深的印象,我準備追蹤一個GET網絡請求的具...

    3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習

    3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 自學資源 作業內容 1、基本操作演練【建議做】 天空盒的制作: 地圖的制作: 整體效果: 2、編程實踐 項目要求: 項目結構: 代碼詳解: Actions: ISSActionCallback.cs SSAction.cs SSAction...

    FlycoTabLayout 的使用

    FlycoTabLayout 一個Android TabLayout庫,目前有3個TabLayout SlidingTabLayout:參照PagerSlidingTabStrip進行大量修改. 新增部分屬性 新增支持多種Indicator顯示器 新增支持未讀消息顯示 新增方法for懶癌患者 CommonTabLayout:不同于SlidingTabLayout對ViewPager依賴,它是一個不...

    爬蟲項目實戰八:爬取天氣情況

    爬取天氣情況 目標 項目準備 接口分析 代碼實現 效果顯示 寫入本地 目標 根據天氣接口,爬取接下來一周的天氣情況。 項目準備 軟件:Pycharm 第三方庫:requests,BeautifulSoup,csv 接口地址:http://api.k780.com:88/?app=weather.future&weaid=城市名&appkey=10003&sign=b59bc...

    關于web項目的目錄問題

    先給段代碼: 上面這個代碼一直出錯,我不知道原因,后面不停的查找資料發現了問題:我的web項目輸出目錄有問題,因為我也是第一次用idea寫web項目,發現很多bug 其實都沒有太大問題,我們需要注意的是你必須在out這個輸出文件夾中擁有這個文件,out輸出文件夾會默認過濾這些文件...

    精品国产乱码久久久久久蜜桃不卡