Retrofit2的使用

1差导,Retrofit2的使用步驟

1脓匿,定義接口(封裝URL地址和數(shù)據(jù)請(qǐng)求)
2遍略,實(shí)例化Retrofit
3压鉴,通過Retrofit實(shí)例創(chuàng)建接口服務(wù)對(duì)象
4崖咨,接口服務(wù)對(duì)象調(diào)用接口中的方法,獲取Call對(duì)象
5油吭,Call對(duì)象執(zhí)行請(qǐng)求(異步击蹲、同步請(qǐng)求)

2.Retrofit2發(fā)送GET署拟、POST請(qǐng)求(異步、同步)

1.Retrofit2發(fā)送GET

//主機(jī)地址
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對(duì)象
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(MyServer.URL)
            .build();
    
    //2.獲取MyServer接口服務(wù)對(duì)象
    MyServer myServer = retrofit.create(MyServer.class);
    
    //3.獲取Call對(duì)象
    //方式一
    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對(duì)象執(zhí)行請(qǐng)求
    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);//默認(rèn)直接回調(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對(duì)象
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(MyServer.URL)
            .build();

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

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

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

            try {
                //4.Call對(duì)象執(zhí)行請(qǐng)求
                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);//默認(rèn)直接回調(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對(duì)象
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(MyServer.URL)
            .build();

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

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

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

    //4.Call對(duì)象執(zhí)行請(qǐng)求
    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);//默認(rèn)直接回調(diào)主線程
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

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

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

3.Retrofit注解

注解代碼 請(qǐng)求格式

請(qǐng)求方式:
@GET GET請(qǐng)求
@POST POST請(qǐng)求
@DELETE DELETE請(qǐng)求
@HEAD HEAD請(qǐng)求
@OPTIONS OPTIONS請(qǐng)求
@PATCH PATCH請(qǐng)求

請(qǐng)求頭:
@Headers("K:V") 添加請(qǐng)求頭歌豺,作用于方法
@Header("K") 添加請(qǐng)求頭推穷,參數(shù)添加頭
@FormUrlEncoded 用表單數(shù)據(jù)提交,搭配參數(shù)使用
@Stream 下載
@Multipart 用文件上傳提交 multipart/form-data

請(qǐng)求參數(shù):
@Query 替代參數(shù)值类咧,通常是結(jié)合get請(qǐng)求的
@QueryMap 替代參數(shù)值馒铃,通常是結(jié)合get請(qǐng)求的
@Field 替換參數(shù)值,是結(jié)合post請(qǐng)求的
@FieldMap 替換參數(shù)值痕惋,是結(jié)合post請(qǐng)求的

請(qǐng)求路徑:
@Path 替換路徑
@Url 路徑拼接

請(qǐng)求體:
@Body(RequestBody) 設(shè)置請(qǐng)求體区宇,是結(jié)合post請(qǐng)求的

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市值戳,隨后出現(xiàn)的幾起案子议谷,更是在濱河造成了極大的恐慌,老刑警劉巖堕虹,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卧晓,死亡現(xiàn)場離奇詭異,居然都是意外死亡赴捞,警方通過查閱死者的電腦和手機(jī)逼裆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赦政,“玉大人胜宇,你說我怎么就攤上這事≈缱辏” “怎么了掸屡?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長然评。 經(jīng)常有香客問我仅财,道長,這世上最難降的妖魔是什么碗淌? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任盏求,我火速辦了婚禮,結(jié)果婚禮上亿眠,老公的妹妹穿的比我還像新娘碎罚。我一直安慰自己,他們只是感情好纳像,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布荆烈。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪憔购。 梳的紋絲不亂的頭發(fā)上宫峦,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音玫鸟,去河邊找鬼导绷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛屎飘,可吹牛的內(nèi)容都是我干的妥曲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钦购,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼檐盟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肮雨,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤遵堵,失蹤者是張志新(化名)和其女友劉穎箱玷,沒想到半個(gè)月后怨规,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锡足,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年波丰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舶得。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掰烟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沐批,到底是詐尸還是另有隱情纫骑,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布九孩,位于F島的核電站先馆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏躺彬。R本人自食惡果不足惜煤墙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宪拥。 院中可真熱鬧仿野,春花似錦、人聲如沸她君。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缔刹。三九已至球涛,卻和暖如春魄梯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宾符。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工酿秸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魏烫。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓辣苏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哄褒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稀蟋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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