Retrofit 新手教程

官方介紹

Type-safe HTTP client for Android and Java - 用于Android和Java的類型安全的HTTP客戶端忆植。

加載新手教程

Retrofit譯為“改進(jìn)”蝌诡,改進(jìn)了啥纬向?實(shí)際上Retrofit是基于OkHttp網(wǎng)絡(luò)框架的封裝参滴。

首先我們來看看,使用Retrofit發(fā)送一個(gè)請(qǐng)求的大概流程:

  1. 我們使用Retrofit的接口層對(duì)URL、請(qǐng)求方式、請(qǐng)求參數(shù)勇边、Header等進(jìn)行封裝
  2. Retrofit使用OkHttp完成真正的請(qǐng)求操作
  3. OkHttp將服務(wù)器返回的數(shù)據(jù)提供給Retrofit
  4. Retrofit根據(jù)我們的需求去解析數(shù)據(jù)。

進(jìn)入新手教程

簡單介紹完Retrofit之后折联,讓我們來看看具體應(yīng)該怎么使用&&一起完成一個(gè)搜索古詩小Demo


搜索古詩小Demo
  • 首先我們打開Android Studio粒褒,新建RetrofitDemo項(xiàng)目

  • 添加依賴

    //Retrofit庫
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'

獲取最新版本請(qǐng)移步Retrofit Github官方地址

  • activity_main.xml布局文件中添加以下控件并根據(jù)自己喜好排版
    3個(gè)TextView:title標(biāo)題、author作者诚镰、content內(nèi)容
    1個(gè)EditText 編輯框
    1個(gè)Button 按鈕
    1個(gè)ProgressBar 進(jìn)度條(可要可不要)
    然后在MainActivity中將實(shí)例化他們

  • 搜索古詩API
    https://api.apiopen.top/searchPoetry?name=
    這里我用的是簡書用戶有夢(mèng)想的程序丶猿老哥提供的免費(fèi)開放接口API(點(diǎn)擊跳轉(zhuǎn))

  • 新建古詩實(shí)體類Poetry
    這里給大家推薦一款實(shí)用小插件GsonFormat奕坟,它可以幫我們快速生成一個(gè)實(shí)體類
    安裝方式:File - Settings... - Plugins - 搜索GsonFormat - 點(diǎn)擊右側(cè)綠色I(xiàn)nstall plugin按鈕
    等待安裝完成重啟Android Stdio就可以使用了
    使用方式:在瀏覽器中打開https://api.apiopen.top/searchPoetry?name=靜夜思,將返回的整個(gè)JSON數(shù)據(jù)復(fù)制清笨,然后回到Poetry類中月杉,按下alt+ins選擇GsonFormat,將內(nèi)容粘貼到這里抠艾,然后點(diǎn)OK苛萎,就能看到GsonFormat幫我們自動(dòng)生成好的實(shí)體類內(nèi)容了~

public class Poetry {


    /**
     * code : 200
     * message : 成功!
     * result : [{"title":"靜夜思","content":"床前看月光,疑是地上霜检号。|舉頭望山月腌歉,低頭思故鄉(xiāng)。","authors":"李白"}]
     */

    private int code;
    private String message;
    private List<ResultBean> result;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public List<ResultBean> getResult() {
        return result;
    }

    public void setResult(List<ResultBean> result) {
        this.result = result;
    }

    public static class ResultBean {
        /**
         * title : 靜夜思
         * content : 床前看月光齐苛,疑是地上霜翘盖。|舉頭望山月,低頭思故鄉(xiāng)脸狸。
         * authors : 李白
         */

        private String title;
        private String content;
        private String authors;

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

        public String getAuthors() {
            return authors;
        }

        public void setAuthors(String authors) {
            this.authors = authors;
        }
    }
}
  • MainActivity中創(chuàng)建Retrofit實(shí)例
Retrofit retrofit = new Retrofit.Builder()  //創(chuàng)建Retrofit實(shí)例
            .baseUrl("https://api.apiopen.top/")    //這里需要傳入url的域名部分
            .addConverterFactory(GsonConverterFactory.create()) //返回的數(shù)據(jù)經(jīng)過轉(zhuǎn)換工廠轉(zhuǎn)換成我們想要的數(shù)據(jù)最仑,最常用的就是Gson
            .build();   //構(gòu)建實(shí)例

我們期望請(qǐng)求返回的結(jié)果Retrofit能幫我們加工成剛才定義的實(shí)體類,所以我們需要添加Gson轉(zhuǎn)換工廠炊甲,使用GsonConverterFactory之前我們需要先添加以下依賴

//將剛才添加的retrofit依賴庫中的retrofit替換成converter-gson即可
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
  • 新建一個(gè)RetrofitService接口類泥彤,用于定義所有網(wǎng)絡(luò)請(qǐng)求
    在本案例中,我們使用的是一個(gè)GET請(qǐng)求卿啡,讓我們來看看怎么去定義這個(gè)請(qǐng)求
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;

public interface RetrofitService {
    //get請(qǐng)求接口
    @GET("searchPoetry")    //指定請(qǐng)求類型的注解
    Call<Poetry> getPoetry(@Query("name") String name);   //獲取古詩的方法
}

首先我們?cè)讷@取古詩方法的上面添加了一個(gè)GET注解吟吝,并在括號(hào)里傳入了url的后半段,也就是你要訪問前面域名baseUrl下的哪個(gè)文件(接口)
相應(yīng)的颈娜,Retrofit肯定也為我們提供了@POST/@PUT等注解剑逃,用法相同
然后我們定義了一個(gè)返回類型為Call實(shí)體的方法getPoetry,并指定其泛型為Poetry類官辽,緊接著我們看到這個(gè)方法的傳入?yún)?shù)為@Query("name") String name蛹磺,再次觀察url的最后一部分searchPoetry?name=靜夜思,不難發(fā)現(xiàn)同仆,name=靜夜思中的name就是@Query("name")注解萤捆,而靜夜思就是我們傳入的String字符串,原來Retrofit會(huì)幫我們自動(dòng)處理好,我們只需要把a(bǔ)pi接口需要的參數(shù)用@Query注解標(biāo)記俗或,然后傳值就可以了市怎,除了@Query,再介紹一些Retrofit為我們提供的常用注解:

GET請(qǐng)求

@QueryMap :傳入?yún)?shù)較多時(shí)辛慰,可以把參數(shù)放在Map中
……

POST

@Body:將一整個(gè)對(duì)象作為請(qǐng)求體
@Field:表單數(shù)據(jù)鍵值對(duì)傳輸
具體用法請(qǐng)閱讀Retrofit官方文檔

  • 接下來我們將在MainActivity中完成實(shí)現(xiàn)接口類 → 使用接口類中的請(qǐng)求方法獲取一個(gè)Call對(duì)象 → 使用Call對(duì)象發(fā)送請(qǐng)求并編寫回調(diào)Callback邏輯区匠,由于我在代碼中已經(jīng)為大部分步驟寫好了注釋,所以直接貼上MainActivity代碼
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity {

    private TextView title; //古詩標(biāo)題
    private TextView author;    //古詩作者
    private TextView content;   //古詩內(nèi)容
    private EditText editText;  //編輯框
    private Button find;    //查找古詩按鈕
    private RetrofitService service;    //請(qǐng)求接口
    private ProgressBar progressBar;    //進(jìn)度條


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

        //綁定控件
        title = findViewById(R.id.title);
        author = findViewById(R.id.author);
        content = findViewById(R.id.content);
        editText = findViewById(R.id.edit_text);
        find = findViewById(R.id.button);
        progressBar = findViewById(R.id.progress_bar);

        Retrofit retrofit = new Retrofit.Builder()  //創(chuàng)建Retrofit實(shí)例
                .baseUrl("https://api.apiopen.top/")    //url頭部
                .addConverterFactory(GsonConverterFactory.create()) //返回的數(shù)據(jù)經(jīng)過轉(zhuǎn)換工廠轉(zhuǎn)換成我們想要的數(shù)據(jù)帅腌,最常用的就是Gson
                .build();   //構(gòu)建實(shí)例
        service = retrofit.create(RetrofitService.class);   //使用retrofit的create()方法實(shí)現(xiàn)請(qǐng)求接口類

        find.setOnClickListener(new View.OnClickListener() {    //設(shè)置按鈕點(diǎn)擊事件
            @Override
            public void onClick(View v) {
                progressBar.setVisibility(View.VISIBLE);    //進(jìn)度條顯示
                request();
            }
        });

    }

    //請(qǐng)求古詩的方法
    private void request() {
        Call<Poetry> call = service.getPoetry(editText.getText().toString());   //通過getPoetry()方法獲取Call對(duì)象
        call.enqueue(new Callback<Poetry>() {   //call入列發(fā)送請(qǐng)求驰弄,傳入回調(diào)Callback,重寫成功onRespons()與失敗onFailure()方法狞膘,并編寫相應(yīng)邏輯
            /**
             * 請(qǐng)求成功
             * */
            @Override
            public void onResponse(Call<Poetry> call, Response<Poetry> response) {  //返回的response中包含了所有信息揩懒,其中response.body就是響應(yīng)主體
                if (response.body().getResult().size() > 0) {   //由于我們已經(jīng)添加了Gson轉(zhuǎn)換工廠,所以響應(yīng)主體會(huì)被轉(zhuǎn)換成Poetry對(duì)象挽封,使用對(duì)象響應(yīng)方法判斷返回的古詩是否大于一首
                    title.setText(response.body().getResult().get(0).getTitle());   //數(shù)據(jù)展示
                    author.setText(response.body().getResult().get(0).getAuthors());
                    String contentText = response.body().getResult().get(0).getContent().replace("|", "\n"); //由于接口返回的古詩體用"|"代替換行已球,所以我們想要換行輸出就要替換回來
                    content.setText(contentText);
                } else {
                    Toast.makeText(MainActivity.this, "這就觸及到我的知識(shí)盲區(qū)了", Toast.LENGTH_SHORT).show();   //古詩沒有大于一首
                }
                progressBar.setVisibility(View.INVISIBLE);  //進(jìn)度條隱藏
            }

            /**
             * 請(qǐng)求失敗
             * */
            @Override
            public void onFailure(Call<Poetry> call, Throwable t) {
                progressBar.setVisibility(View.INVISIBLE);  //進(jìn)度條隱藏
                Log.d("ManiActivity", t.getMessage());  //控制臺(tái)打印報(bào)錯(cuò)原因
            }
        });

    }
}
  • 最后一步
    也是經(jīng)常容易忘記的一步,在AndroidManifest.xml中添加網(wǎng)絡(luò)請(qǐng)求權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>

新手教程結(jié)束

對(duì)于Retrofit本篇僅是了解個(gè)入門辅愿,更多Retrofit的用法還需繼續(xù)學(xué)習(xí)智亮!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市点待,隨后出現(xiàn)的幾起案子阔蛉,更是在濱河造成了極大的恐慌,老刑警劉巖癞埠,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件状原,死亡現(xiàn)場離奇詭異,居然都是意外死亡苗踪,警方通過查閱死者的電腦和手機(jī)颠区,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來通铲,“玉大人毕莱,你說我怎么就攤上這事÷幔” “怎么了朋截?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吧黄。 經(jīng)常有香客問我部服,道長,這世上最難降的妖魔是什么拗慨? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任饲宿,我火速辦了婚禮厦酬,結(jié)果婚禮上胆描,老公的妹妹穿的比我還像新娘瘫想。我一直安慰自己,他們只是感情好昌讲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布国夜。 她就那樣靜靜地躺著,像睡著了一般短绸。 火紅的嫁衣襯著肌膚如雪车吹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天醋闭,我揣著相機(jī)與錄音窄驹,去河邊找鬼。 笑死证逻,一個(gè)胖子當(dāng)著我的面吹牛乐埠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播囚企,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼丈咐,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了龙宏?” 一聲冷哼從身側(cè)響起棵逊,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎银酗,沒想到半個(gè)月后辆影,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黍特,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蛙讥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衅澈。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡键菱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出今布,到底是詐尸還是另有隱情经备,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布部默,位于F島的核電站侵蒙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏傅蹂。R本人自食惡果不足惜纷闺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一算凿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犁功,春花似錦氓轰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至限嫌,卻和暖如春靴庆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怒医。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工炉抒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稚叹。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓焰薄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親入录。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛤奥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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