Retrofit的基本使用

基本概念

Retrofit是對(duì)http網(wǎng)絡(luò)請(qǐng)求框架的封裝,一般由okhttp來負(fù)責(zé)網(wǎng)絡(luò)請(qǐng)求,retrofit對(duì)請(qǐng)求接口進(jìn)行封裝。retrofit通過接口和注解來描述我們的網(wǎng)絡(luò)請(qǐng)求,然后通過client去調(diào)用okhttp框架,輸入baseurl,通過addConverterFactory來實(shí)現(xiàn)對(duì)返回的json數(shù)據(jù)進(jìn)行處理,轉(zhuǎn)換成我們需要的數(shù)據(jù)類型,如果搭配rxjava的話還會(huì)加上addCallAdapterFactory來轉(zhuǎn)換成其他數(shù)據(jù)類型。

接口部分

@GET("news")
    Call<NewsList> getNews();

這里get里面的news是請(qǐng)求地址的一部分,是在你的baseurl的基礎(chǔ)上添加的后續(xù)地址,而call里面就是自己定義的數(shù)據(jù)類
數(shù)據(jù)類要根據(jù)返回的JSON數(shù)據(jù)進(jìn)行處理,比如這里是


JSON數(shù)據(jù)

可以看到是一個(gè)jsonarray,里面是多個(gè)jsonobject,如果是以前的話是要自己寫代碼去解析,現(xiàn)在都交給retrofit來處理。

數(shù)據(jù)類

public class NewsList {
    @SerializedName("data")
    private List<News> news ;
    public List<News> getNews() {
        return news;
    }
    public void setNews(List<News> news) {
        this.news = news;
    }
}

這里需要注意的是@SerializedName注解,這個(gè)意思就是可以屬性重命名,把json里面的數(shù)據(jù)名字重新命名成我們自己定義的名字,然后News類就是我獲取到的新聞的部分?jǐn)?shù)據(jù),如下

    @SerializedName("id")
    private int id;
    @SerializedName("title")
    private String title;
    @SerializedName("summary")
    private String summary;

retrofit實(shí)例

retrofit的創(chuàng)建是非常簡單的,只需要告訴baseurl然后添加convertfactory就行,然后代碼如下

                Retrofit retrofit = new Retrofit.Builder()
                        .addConverterFactory(GsonConverterFactory.create())
                        .baseUrl("https://api.readhub.cn")
                        .build();
                MyService request = retrofit.create(MyService.class);
                Call<NewsList> call = request.getNews2();
                call.enqueue(new Callback<NewsList>() {
                    @Override
                    public void onResponse(Call<NewsList> call, Response<NewsList> response) {
                        textView.setText("");
                        for (News news:response.body().getNews()){
                            Log.e(TAG, "onResponse: "+news.getTitle() );
                        }
                    }

                    @Override
                    public void onFailure(Call<NewsList> call, Throwable t) {
                        Log.e(TAG, "onFailure: "+t);
                    }
                });

這里就是獲取到請(qǐng)求頭之后,數(shù)據(jù)都存放在response.body().getNews()中,通過遍歷取出來后在日志打印每個(gè)新聞的title,結(jié)果如下圖


打印日志

這樣子就成功取出來數(shù)據(jù)了。

取出原始的json數(shù)據(jù)

如果想要最原始的json數(shù)據(jù),不要處理后的結(jié)果,接口就要改成

    @GET("news")
    Call<ResponseBody> getNews();

之后的和前面沒什么區(qū)別,如果要查看的話返回的數(shù)據(jù)就是在response.body().bytes()中,可以直接打印查看。

總結(jié)

基本使用過程:先建立接口,然后通過builder模式建立一個(gè)retrofit,添加baseurl和convertFactory等基本信息,通過retrofit.create方法來獲取網(wǎng)絡(luò)接口對(duì)象,調(diào)用這個(gè)接口的方法,得到一個(gè)網(wǎng)絡(luò)工作對(duì)象,然后調(diào)用enqueue方法來發(fā)起請(qǐng)求并得到回調(diào)后的結(jié)果并進(jìn)行處理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容