Okhttp的基礎(chǔ)使用

1.添加依賴:

 implementation("com.squareup.okhttp3:okhttp:4.9.0")

2.配置請求:

  • 2.1 GET請求:
  • GET 同步請求:
 //同步請求,請求時沒回應(yīng)拔疚,會阻塞
    public void getSync(View view) {
    OkHttpClient okHttpClient = new OkHttpClient();
        //網(wǎng)絡(luò)請求必須在子線程執(zhí)行
        new Thread(){
            @Override
            public void run() {
                //Request代表請求對象肥隆,會將域名,請求地址稚失,參數(shù)封裝
                //若是要在get后面直接加參數(shù)格式是在get后面加:?a=1&b=2
                Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
                //準(zhǔn)備好請求的Call對象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    Log.i(TAG, "getSync: "+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
  • GET異步請求:
 public void getAsync(View view) {
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
        //準(zhǔn)備好請求的Call對象
        Call call = okHttpClient.newCall(request);
        //進(jìn)行異步請求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
           //響應(yīng)碼 200~299成功栋艳,400~500服務(wù)器錯誤,跟服務(wù)器的通信是成功的都會回調(diào)這個函數(shù)句各,但是服務(wù)器處理請求的數(shù)據(jù)不一定成功
                if (response.isSuccessful()){
                    Log.i(TAG, "getAsync: "+response.body().string());
                }
            }
        });
    }
  • 2.2 POST請求:
  • POST同步請求:
   public void postSync(View view) {
        OkHttpClient okHttpClient = new OkHttpClient();
        //okhttp創(chuàng)建的request對象默認(rèn)是get請求吸占,如果是post要使用FormBody配合.post()設(shè)置
        //而POST請求要設(shè)置RequestBody
        new Thread(){
            @Override
            public void run() {
                FormBody formBody = new FormBody.Builder()
                        .add("a", "1")
                        .add("b", "2")
                        .build();
                Request request = new Request.Builder()
                        .url("https://www.httpbin.org/post")
                        .post(formBody)
                        .build();
                //準(zhǔn)備好請求的Call對象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    Log.i(TAG, "PostSync: "+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }.start();
    }
  • POST異步請求:
 public void postAsync(View view) {
        OkHttpClient okHttpClient = new OkHttpClient();
        FormBody formBody = new FormBody.Builder()
                .add("a", "1")
                .add("b", "2")
                .build();
        Request request = new Request.Builder()
                .url("https://www.httpbin.org/post")
                .post(formBody)
                .build();
        //準(zhǔn)備好請求的Call對象
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                if (response.isSuccessful()){
                    Log.i(TAG, "PostAsync: "+response.body().string());
                }
            }
        });
    }

兩者綜合來看,request對應(yīng)的是get請求凿宾,而formbody對應(yīng)的是post請求

3.添加攔截器:

 public void interceptorTest(){
        //addInterceptor一定在前面執(zhí)行矾屯,addNetworkInterceptor一定在后面執(zhí)行
        //使用cache緩存
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                //開啟緩存
                .cache(new Cache(new File("C:\\Users\\Administrator\\Desktop\\cache"),1024*1024))
                .addInterceptor(new Interceptor() {
            @NotNull
            @Override
            public Response intercept(@NotNull Chain chain) throws IOException {
                //請求之前的前置處理,和請求之后的后置處理
                //例如請求前初厚,添加平臺件蚕,版本號
                //在請求前可以拿到這個request對象,再重新封裝一個新的request,把平臺信息和版本號封裝進(jìn)去,再發(fā)出去
                //攔截器可以添加多個产禾,按照順序來執(zhí)行
                Request request = chain.request().newBuilder().addHeader("os", "android").addHeader("version", "1.1.0").build();
                Response response = chain.proceed(request);
                return response;
            }
        }).addNetworkInterceptor(new Interceptor() {
            @NotNull
            @Override
            public Response intercept(@NotNull Chain chain) throws IOException {
                System.out.println("version:"+chain.request().header("version"));
                return chain.proceed(chain.request());
            }
        }).build();

        Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4.文件上傳:

public void uploadFileTest(){
        //上傳的是:文件的key,文件的名字排作,文件本身
        //采用的是MultipartBody來封裝
        //MediaType詳情參考:https://blog.csdn.net/sinat_34241861/article/details/110648469
        //Content_Type:application/x-www-form-urlencoded 默認(rèn)是這種提交,采取的形式是鍵值對形式:key1:value1&key2:value2&key3:value3
        //Content_type:multipart/form-data下愈,數(shù)據(jù)被編碼為一條消息纽绍,一般用于文件上傳
        //Content_Type:application/octet-stream,提交二進(jìn)制數(shù)據(jù)势似,如果用于文件上傳拌夏,只能上傳一個文件
        //Content_Type:application/json,提交json數(shù)據(jù)
       OkHttpClient okHttpClient = new OkHttpClient();
        File file1 = new File("C:\\Users\\Administrator\\Desktop\\1.txt");
        File file2 = new File("C:\\Users\\Administrator\\Desktop\\2.txt");
        MultipartBody multipartBody = new MultipartBody.Builder()
                .addFormDataPart("file1", file1.getName(), RequestBody.create(file1, MediaType.parse("text/plain")))
                .addFormDataPart("file2", file2.getName(), RequestBody.create(file1, MediaType.parse("text/plain")))
                .addFormDataPart("a","1")//還可以添加額外的參數(shù)
                .build();
        Request request = new Request.Builder().url("https://www.httpbin.org/post").post(multipartBody).build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }

5.Json數(shù)據(jù)上傳:

         //上傳json數(shù)據(jù)
        //使用的RequestBody來封裝
        OkHttpClient okHttpClient = new OkHttpClient();
        RequestBody requestBody = RequestBody.create("{\"a\":1,\"b\":2}", MediaType.parse("application/json"));
        Request request = new Request.Builder().url("https://www.httpbin.org/post").post(requestBody).build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }

.使用cookies:

cookie是某些網(wǎng)站為了辨別用戶的身份僧著,進(jìn)行會話跟蹤(比如確定登錄狀態(tài))而存儲在本地終端上的數(shù)據(jù),由客戶端保存信息

public class UseCookie {
    //cookie的相關(guān)配置
    Map<String,List<Cookie>> cookies = new HashMap<>();
    @Test
    public void useCookie(){
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
                    @Override
                    public void saveFromResponse(@NotNull HttpUrl httpUrl, @NotNull List<Cookie> list) {
                        //會把服務(wù)器返回的cookie封裝成list集合障簿,返回回來盹愚,可以用文件保存或者放在內(nèi)存中
                        cookies.put(httpUrl.host(),list);
                    }
                    @NotNull
                    @Override
                    public List<Cookie> loadForRequest(@NotNull HttpUrl httpUrl) {
                        //請求網(wǎng)站的url
                      List<Cookie> cookies = UseCookie.this.cookies.get(httpUrl.host());
                      return cookies == null ? new ArrayList<Cookie>():cookies;
                    }
                })
                .build();
       //填入你自己的wanandroid賬號和密碼
        FormBody formBody = new FormBody.Builder().add("username", "xxx")
                .add("password", "xxxxxx").build();
        Request request = new Request.Builder().url("https://www.wanandroid.com/user/login")
                .post(formBody)
                .build();
        //準(zhǔn)備好請求的Call對象
        Call call = okHttpClient.newCall(request);
        //進(jìn)行同步請求
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }

        //請求收藏文章列表接口
        request = new Request.Builder().url("https://www.wanandroid.com/lg/collect/list/0/json")
                .build();
        //準(zhǔn)備好請求的Call對象
        call = okHttpClient.newCall(request);
        //進(jìn)行同步請求
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市站故,隨后出現(xiàn)的幾起案子皆怕,更是在濱河造成了極大的恐慌,老刑警劉巖西篓,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愈腾,死亡現(xiàn)場離奇詭異,居然都是意外死亡岂津,警方通過查閱死者的電腦和手機(jī)虱黄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吮成,“玉大人橱乱,你說我怎么就攤上這事×桓Γ” “怎么了泳叠?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茶宵。 經(jīng)常有香客問我危纫,道長,這世上最難降的妖魔是什么节预? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任叶摄,我火速辦了婚禮,結(jié)果婚禮上安拟,老公的妹妹穿的比我還像新娘。我一直安慰自己宵喂,他們只是感情好糠赦,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锅棕,像睡著了一般拙泽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上裸燎,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天顾瞻,我揣著相機(jī)與錄音,去河邊找鬼德绿。 笑死荷荤,一個胖子當(dāng)著我的面吹牛退渗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕴纳,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼会油,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了古毛?” 一聲冷哼從身側(cè)響起翻翩,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稻薇,沒想到半個月后嫂冻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡塞椎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年桨仿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忱屑。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹬敲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莺戒,到底是詐尸還是另有隱情伴嗡,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布从铲,位于F島的核電站瘪校,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏名段。R本人自食惡果不足惜阱扬,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伸辟。 院中可真熱鬧麻惶,春花似錦、人聲如沸信夫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽静稻。三九已至警没,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間振湾,已是汗流浹背杀迹。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留押搪,地道東北人树酪。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓浅碾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗅回。 傳聞我的和親對象是個殘疾皇子及穗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容