基本概念
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)行處理,比如這里是

可以看到是一個(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)行處理。