Retrofit的使用

Retrofit相關(guān)依賴

  implementation'com.squareup.retrofit2:retrofit:2.9.0'
  implementation'com.squareup.retrofit2:converter-gson:2.9.0'

基本使用步驟:

在進行請求之前,要先創(chuàng)建一個接口:

public interface HttpBinService {
    //所有的請求都要以注解的方式進行聲明

    //有兩種提方式:FormUrlEncoded(對應(yīng)key-value形式)或者MulityPart(文件形式)
    //@Field("xxx")這里面是傳的參數(shù)的名字
    //https:www.httpbin.org/post xxx=value
    //括號后面是拼接在請求BaseUrl后面的忙灼,"https://www.httpbin.org/get?username=張三&pwd=456"
   //這里是以表單的形式提交的
    @POST("post")
    @FormUrlEncoded
    Call<ResponseBody> post(@Field("username") String name, @Field("pwd") String password);

    //get請求要傳參數(shù)匠襟,使用的就是Query;post請求要傳參數(shù),使用的就是Field
    @GET("get")
    Call<ResponseBody> get(@Query("username") String username, @Query("pwd") String password);

}

接口創(chuàng)建好之后在對應(yīng)位置聲明成員變量和初始化retrofit和接口實例化對象

  private Retrofit retrofit;
  private HttpBinService binService;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        retrofit = new Retrofit.Builder().baseUrl("https:www.httpbin.org").build();
        binService = retrofit.create(HttpBinService.class);
    }

1.POST請求
  • 請求有同步和異步請求该园,同步調(diào)用excute,異步調(diào)用enqueue酸舍;區(qū)別是同步請求是阻塞執(zhí)行,在沒有收到服務(wù)器反饋之前里初,不會有任何操作啃勉,異步請求是不用等待服務(wù)器反饋,可以繼續(xù)執(zhí)行其他邏輯双妨。
  • 1.1 基礎(chǔ)請求
 //retrofit中的post請求淮阐,基礎(chǔ)使用
    public void post(View view) {
        Call<ResponseBody> call = binService.post("xxx", "123");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });
    }
  • 1.2 以RequestBody方式進行請求
    沒有添加@FormUrlEncoded注解,但請求返回的形式與之相同
public interface HttpBinService {
  //此處沒有@FormUrlEncoded注解
  @POST("post")
    Call<ResponseBody> postBody(@Body RequestBody body);
}

所以在代碼請求時候需要自己來封裝

  public void postBody(View view) {
        //手動封裝key-value刁品,請求結(jié)果與添加了@FormUrlEncoded注解的形式相同
       //相對于添加@FormUrlEncoded來說更加靈活
        FormBody formBody = new FormBody.Builder()
                .add("a","1").add("b","2").build();
        Call<ResponseBody> bodyCall = binService.postBody(formBody);
        bodyCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });
    }
  • 1.3使用Path形式來請求
    @Path注解相當(dāng)于替換泣特,將參數(shù)替換并添加到請求地址后面
public interface HttpBinService {
//此時拼接出來的地址形式為: "https://www.httpbin.org/path",
//添加了頭部(用于區(qū)分android和ios)挑随,同時以表單形式提交了用戶名和密碼
 @POST("{id}")
    @FormUrlEncoded
    Call<ResponseBody> postInPath(@Path("id") String path
                                  , @Header("os") String os
                                  , @Field("username") String name
                                  , @Field("pwd") String pwd);
}

實際請求如下:

  public void usePath(View view) {
        Call<ResponseBody> call = binService.postInPath("post","android","xxxxx","123456");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

            }
        });
    }
  • 1.4使用多個請求頭
    使用多個請求頭的目的一般是用來區(qū)分平臺或者上傳版本號等等
public interface HttpBinService {
  //多個頭
    @Headers({"os:android", "version:1.0.0"})
    @POST("post")
    Call<ResponseBody> postWithHeaders();
}

方法調(diào)用

 public void usePostHeaders(View view) {
        Call<ResponseBody> call = binService.postWithHeaders();
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

            }
        });
    }
  • 1.5使用URL請求
public interface HttpBinService {
  //url注解,也要加上相關(guān)注解POST或者GET状您,指定的是一個完整的地址,不看BaseUrl,只看傳遞進來的地址
    @POST
    Call<ResponseBody> postInUrl(@Url String url);
}

請求地址要自己指定

    public void usePostInUrl(View view) {
       // 自己指定請求地址
        Call<ResponseBody> call = binService.postInUrl("https://www.httpbin.org/post");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

            }
        });
    }
2.GET請求
  • 和post請求一樣均有同步請求和異步請求膏孟,請求方式相同
 //retrofit中的get請求眯分,基礎(chǔ)使用
    public void get(View view) {
        Call<ResponseBody> call = binService.get("bigzing", "456");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骆莹,隨后出現(xiàn)的幾起案子颗搂,更是在濱河造成了極大的恐慌,老刑警劉巖幕垦,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丢氢,死亡現(xiàn)場離奇詭異,居然都是意外死亡先改,警方通過查閱死者的電腦和手機疚察,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仇奶,“玉大人貌嫡,你說我怎么就攤上這事「盟荩” “怎么了岛抄?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狈茉。 經(jīng)常有香客問我夫椭,道長,這世上最難降的妖魔是什么氯庆? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任蹭秋,我火速辦了婚禮,結(jié)果婚禮上堤撵,老公的妹妹穿的比我還像新娘仁讨。我一直安慰自己,他們只是感情好实昨,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布洞豁。 她就那樣靜靜地躺著,像睡著了一般荒给。 火紅的嫁衣襯著肌膚如雪族跛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天锐墙,我揣著相機與錄音,去河邊找鬼长酗。 笑死溪北,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播之拨,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茉继,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚀乔?” 一聲冷哼從身側(cè)響起烁竭,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吉挣,沒想到半個月后派撕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡睬魂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年终吼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氯哮。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡际跪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喉钢,到底是詐尸還是另有隱情姆打,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布肠虽,位于F島的核電站幔戏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舔痕。R本人自食惡果不足惜评抚,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伯复。 院中可真熱鬧慨代,春花似錦、人聲如沸啸如。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叮雳。三九已至想暗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帘不,已是汗流浹背说莫。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寞焙,地道東北人储狭。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓互婿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辽狈。 傳聞我的和親對象是個殘疾皇子慈参,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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

  • 本文為翻譯Retrofit 官方文檔 翻譯不準(zhǔn)確,所以配上英文刮萌。此操作只為自己方便查看驮配。 介紹 Introdu...
    S_ZY閱讀 635評論 0 1
  • 盜版文章 原文非常棒,原文 前言 在Andrroid開發(fā)中着茸,網(wǎng)絡(luò)請求十分常用 而在Android網(wǎng)絡(luò)請求庫中壮锻,Re...
    黑色海鷗閱讀 512評論 0 0
  • 2015-03-29 12:00 最近將Android項目的網(wǎng)絡(luò)連接庫切換到了Retrofit 2.0,以前用的V...
    SimpleFunc閱讀 188評論 0 1
  • 引入相關(guān)依賴 在實例中,使用的是Gson對Json數(shù)據(jù)進行解析元扔。 下面的實例是對github的接口進行請求: (1...
    皓皓amous閱讀 281評論 0 0
  • 前言 最近有個想法——就是把 Android 主流開源框架進行深入分析躯保,然后寫成一系列文章,包括該框架的詳細(xì)使用與...
    wildma閱讀 2,033評論 0 14