Android Retrofit2的詳細使用

Retrofit2

1.Retrofit2概述

1,Retrofit框架是Square公司出品的目前非常流行的網(wǎng)絡(luò)框架.
效率高串慰,實現(xiàn)簡單裹纳,運用注解和動態(tài)代理.
極大簡化了網(wǎng)絡(luò)請求的繁瑣步驟赛不,非常適合REST ful網(wǎng)絡(luò)請求.
目前Retofit版本是2

2,Retrofit其實我們可以理解為OkHttp的加強版碑宴。
它也是一個網(wǎng)絡(luò)加載框架裆甩。底層是使用OKHttp封裝的之斯。
準確來說,網(wǎng)絡(luò)請求的工作本質(zhì)上是OkHttp完成,而 Retrofit 僅負責網(wǎng)絡(luò)請求接口的封裝庞萍。
它的一個特點是包含了特別多注解拧烦,方便簡化你的代碼量。
并且還支持很多的開源庫(著名例子:Retrofit + RxJava)

2.Retrofit2的好處

1钝计,超級解耦
    解耦恋博?解什么耦?
    我們在請求接口數(shù)據(jù)的時候私恬,API接口定義和API接口使用總是相互影
響债沮,什么傳參、回調(diào)等本鸣,耦合在一塊疫衩。有時候我們會考慮一下怎么封裝我們的代
碼讓這兩個東西不那么耦合,這個就是Retrofit的解耦目標荣德,也是它的最大的特點闷煤。
2,可以配置不同HttpClient來實現(xiàn)網(wǎng)絡(luò)請求涮瞻,如OkHttp鲤拿、HttpClient...
3,支持同步署咽、異步和RxJava
4近顷,可以配置不同的反序列化工具來解析數(shù)據(jù),如json宁否、xml...
5窒升,請求速度快,使用非常方便靈活

3.Retrofit2配置

1家淤,官網(wǎng):http://square.github.io/retrofit/
2异剥,依賴:
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
3瑟由,OkHttp庫依賴
    由于Retrofit是基于OkHttp絮重,所以還需要添加OkHttp庫依賴
    implementation 'com.squareup.okhttp3:okhttp:3.12.0'
4,添加網(wǎng)絡(luò)權(quán)限
    <uses-permission android:name="android.permission.INTERNET" />

4歹苦,Retrofit2的使用步驟

1青伤,定義接口(封裝URL地址和數(shù)據(jù)請求)
2,實例化Retrofit
3殴瘦,通過Retrofit實例創(chuàng)建接口服務(wù)對象
4狠角,接口服務(wù)對象調(diào)用接口中的方法,獲取Call對象
5蚪腋,Call對象執(zhí)行請求(異步丰歌、同步請求)

Retrofit2發(fā)送GET姨蟋、POST請求(異步、同步)

1.Retrofit2發(fā)送GET

//主機地址
String URL = "http://api.shujuzhihui.cn/api/news/";//必須以反斜杠結(jié)尾

//接口服務(wù)
public interface MyServer {
    
    //GET
    @GET("categories?appKey=908ca46881994ffaa6ca20b31755b675")
    Call<ResponseBody> getData1();

    @GET("categories?")
    Call<ResponseBody> getData2(@Query("appKey") String appkey);

    @GET("categories?")
    Call<ResponseBody> getData3(@QueryMap Map<String,Object> map);
}

//Get異步
private void initGetEnqueue() {

    //1.創(chuàng)建Retrofit對象
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(MyServer.URL)
            .build();
    
    //2.獲取MyServer接口服務(wù)對象
    MyServer myServer = retrofit.create(MyServer.class);
    
    //3.獲取Call對象
    //方式一
    Call<ResponseBody> call1 = myServer.getData1();

    //方式二
    Call<ResponseBody> call2 = myServer.getData2("908ca46881994ffaa6ca20b31755b675");

    //方式三
    Map<String,Object> map = new HashMap<>();
    map.put("appKey","908ca46881994ffaa6ca20b31755b675");
    Call<ResponseBody> call = myServer.getData3(map);

    //4.Call對象執(zhí)行請求
    call.enqueue(new Callback<ResponseBody>() {

        @Override
        public void onResponse(Call<ResponseBody> call,Response<ResponseBody> response) {

            try {
                String result = response.body().string();

                Log.e("retrofit", "onResponse: "+result);
                tv.setText(result);//默認直接回調(diào)主線程
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {

            Log.e("retrofit", "onFailure: "+t.getMessage());
        }
    });
}


//GET同步
private void initGetExecute() {

    //1.創(chuàng)建Retrofit對象
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(MyServer.URL)
            .build();

    //2.獲取MyServer接口服務(wù)對象
    MyServer myServer = retrofit.create(MyServer.class);

    //3.獲取Call對象
    final Call<ResponseBody> call = myServer.getData1();

    new Thread(){//子線程執(zhí)行
        @Override
        public void run() {
            super.run();

            try {
                //4.Call對象執(zhí)行請求
                Response<ResponseBody> response = call.execute();

                final String result = response.body().string();

                Log.e("retrofit", "onResponse: "+result);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tv.setText(result);//默認直接回調(diào)主線程
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();

}

2.Retrofit2發(fā)送POST

String URL = "http://api.shujuzhihui.cn/api/news/";//必須以反斜杠結(jié)尾

public interface MyServer {
    
    //POST("categories?")    POST("categories")相同
    @POST("categories?")
    @FormUrlEncoded
    Call<ResponseBody> postData1(@Field("appKey") String appKey);

    @POST("categories")  
    @FormUrlEncoded
    Call<ResponseBody> postData2(@FieldMap Map<String,Object> map);
}

//POST異步
private void initPostEnqueue() {

    //1.創(chuàng)建Retrofit對象
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(MyServer.URL)
            .build();

    //2.獲取MyServer接口服務(wù)對象
    MyServer myServer = retrofit.create(MyServer.class);

    //3.獲取Call對象
    //方式一
    Call<ResponseBody> call1 = myServer.postData1("908ca46881994ffaa6ca20b31755b675");

    //方式二
    Map<String,Object> map = new HashMap<>();
    map.put("appKey","908ca46881994ffaa6ca20b31755b675");
    Call<ResponseBody> call = myServer.postData2(map);

    //4.Call對象執(zhí)行請求
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call,Response<ResponseBody> response) {

            try {
                String result = response.body().string();

                Log.e("retrofit", "onResponse: "+result);
                tv.setText(result);//默認直接回調(diào)主線程
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {

            Log.e("retrofit", "onFailure: "+t.getMessage());
        }
    });
}

Retrofit注解

注解代碼       請求格式

請求方式:
    @GET           GET請求
    @POST          POST請求
    @DELETE        DELETE請求
    @HEAD          HEAD請求
    @OPTIONS       OPTIONS請求
    @PATCH         PATCH請求

請求頭:
    @Headers("K:V") 添加請求頭立帖,作用于方法
    @Header("K")    添加請求頭眼溶,參數(shù)添加頭
    @FormUrlEncoded 用表單數(shù)據(jù)提交,搭配參數(shù)使用
    @Multipart      用文件上傳提交   multipart/form-data

請求參數(shù):
    @Query          替代參數(shù)值晓勇,通常是結(jié)合get請求的
    @QueryMap       替代參數(shù)值堂飞,通常是結(jié)合get請求的
    @Field          替換參數(shù)值,是結(jié)合post請求的
    @FieldMap       替換參數(shù)值绑咱,是結(jié)合post請求的

請求路徑:
    @Path           替換路徑
    @Url            路徑拼接

請求體:
    @Body(RequestBody)  設(shè)置請求體绰筛,是結(jié)合post請求的

文件處理:
    @Part Multipart.Part
    @Part("key") RequestBody requestBody(單參)
    @PartMap Map<String,RequestBody> requestBodyMap(多參)
    @Body RequestBody requestBody(自定義參數(shù))

Retrofit2其他常用注解使用

String URL = "http://api.shujuzhihui.cn/api/news/";//必須以反斜杠結(jié)尾

public interface MyServer {
    
    //Path
    @GET("wages/{wageId}/detail") 
    Call<ResponseBody >getImgData(@Path("wageId") String wageId);

    //Url
    @GET
    Call<ResponseBody >getImgData(@Url String url);

    @GET
    Call<ResponseBody >getImgData(@Url String url,@Query("appKey") String appkey);

    
    //Json
    @POST("categories")
    @Headers("Content-Type:application/json")
    Call<ResponseBody> getFormDataJson(@Body RequestBody requestBody);

    //Form
    @POST("categories")
    @Headers("Content-Type:application/x-www-form-urlencoded")
    Call<ResponseBody> getFormData1(@Body RequestBody requestBody);

    //復用URL
    @POST()
    @Headers("Content-Type:application/x-www-form-urlencoded")
    Call<ResponseBody> getFormData2(@Url String url,@Body RequestBody requestBody);

    //通用
    @POST()
    Call<ResponseBody> getFormData3(@Url String url, @Body RequestBody requestBody, @Header("Content-Type") String contentType);
}

//RequestBody參數(shù)拼接
private void initPostBody() {

    Retrofit.Builder builder = new Retrofit.Builder();
    Retrofit retrofit = builder.baseUrl(MyServer.URL)
            .build();

    MyServer myServer = retrofit.create(MyServer.class);

    //Json類型
    String json1 = "{\n" + "    \"appKey\": \"908ca46881994ffaa6ca20b31755b675\"\n" +  "}";
    RequestBody requestBody01 = RequestBody.create(MediaType.parse("application/json,charset-UTF-8"),json1);
    Call<ResponseBody> call01 = myServer.getFormDataJson(requestBody01);

    //String類型
    //有參形式
    RequestBody requestBody02 = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded,charset-UTF-8"),"appKey=908ca46881994ffaa6ca20b31755b675");
    Call<ResponseBody> call02 = myServer.getFormData1(requestBody02);

    //無參形式
    RequestBody requestBody3 = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded,charset-UTF-8"),"");
    Call<ResponseBody> call03 = myServer.getFormData1(requestBody3);

    //RequestBody (Form表單,鍵值對參數(shù)形式)
    //方式一(requestBody)
    FormBody requestBody = new FormBody.Builder()
            .add("appKey","908ca46881994ffaa6ca20b31755b675")
            .build();
    Call<ResponseBody> call1 = myServer.getFormData1(requestBody);

    //方式二(url+requestBody)
    FormBody requestBody = new FormBody.Builder()
            .add("appKey","908ca46881994ffaa6ca20b31755b675")
            .build();
    Call<ResponseBody> call2 = myServer.getFormData2("categories",requestBody);

    //方式三(url+requestBody+header)
    FormBody requestBody = new FormBody.Builder()
            .add("appKey","908ca46881994ffaa6ca20b31755b675")
            .build();
    Call<ResponseBody> call3 = myServer.getFormData3("categories",requestBody,"application/x-www-form-urlencoded");


    call3.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

            try {
                String result = response.body().string();

                Log.e("retrofit", "onResponse: "+result);
                tv.setText(result);//默認直接回調(diào)主線程
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {

            Log.e("retrofit", "onFailure: "+t.getMessage());
        }
    });
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末描融,一起剝皮案震驚了整個濱河市铝噩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稼稿,老刑警劉巖薄榛,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異让歼,居然都是意外死亡敞恋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門谋右,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硬猫,“玉大人,你說我怎么就攤上這事改执⌒ッ郏” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵辈挂,是天一觀的道長衬横。 經(jīng)常有香客問我,道長终蒂,這世上最難降的妖魔是什么蜂林? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拇泣,結(jié)果婚禮上噪叙,老公的妹妹穿的比我還像新娘。我一直安慰自己霉翔,他們只是感情好睁蕾,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般子眶。 火紅的嫁衣襯著肌膚如雪瀑凝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天臭杰,我揣著相機與錄音猜丹,去河邊找鬼。 笑死硅卢,一個胖子當著我的面吹牛射窒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播将塑,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼脉顿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了点寥?” 一聲冷哼從身側(cè)響起艾疟,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敢辩,沒想到半個月后蔽莱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡戚长,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年盗冷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片同廉。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡仪糖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迫肖,到底是詐尸還是另有隱情锅劝,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布蟆湖,位于F島的核電站故爵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隅津。R本人自食惡果不足惜诬垂,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饥瓷。 院中可真熱鬧剥纷,春花似錦痹籍、人聲如沸呢铆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棺克。三九已至悠垛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娜谊,已是汗流浹背确买。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纱皆,地道東北人湾趾。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像派草,于是被迫代替她去往敵國和親搀缠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355