Retrofit2快速入門
大家好,又是心情澎湃的一天,今天我將給大家介紹Retrofit2這個(gè)庫.
Retrofit2是什么?
Retrofit是由Square公司出品的針對(duì)于Android和Java的類型安全的Http客戶端勾哩,吸取了RESTful的風(fēng)格,實(shí)質(zhì)上就是對(duì)okhttp 進(jìn)行了封裝,利用動(dòng)態(tài)代理實(shí)現(xiàn)了網(wǎng)絡(luò)接口底層請求,然后將返回的數(shù)據(jù)就行轉(zhuǎn)換成我們指定的Bean對(duì)象,極大的提高了效率,和網(wǎng)絡(luò)體驗(yàn).
使用依賴
首先在build.gradle中添加如下代碼职员,添加Retrofit2庫
compile 'com.squareup.retrofit2:retrofit:2.3.0'
創(chuàng)建實(shí)列
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("baseurl/") //這里填入端口的url
.build();
必須以 /(斜線) 結(jié)束,不然會(huì)拋出一個(gè)IllegalArgumentException,所以如果你看到別的教程沒有以 / 結(jié)束崔梗,那么可能是直接從Retrofit1 copy過來的。
定義接口
以獲取一本書的頁數(shù)為例子
public interface API {
@GET("book/{page}")
Call<ResponseBody> getPage(@Path("page") int id);
}
在通過上面構(gòu)建的實(shí)列對(duì)象retorfit 進(jìn)行下一步操作
API api = retrofit.create(API.class);
構(gòu)建出代理對(duì)象.
開始請求
上一部已經(jīng)拿到了代理對(duì)象,接下來我們就需要使用代理對(duì)象來進(jìn)行網(wǎng)絡(luò)請求獲取數(shù)據(jù),如下代碼:
Call<ResponseBody> page = api.getPage(10);
page.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//請求成功返回的數(shù)據(jù)
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//請求失敗
}
});
當(dāng)然上面只是異步的請求,回調(diào)到這兩個(gè)方法如果使用同步請求:
try {
Response<ResponseBody> response = page.execute();
//可以根據(jù)返回的response在做處理
} catch (IOException e) {
e.printStackTrace();
}
注意同步請求不要在主線程去使用,一半是在子線程里面發(fā)起請求,后面的代碼需要同步返回的數(shù)據(jù)方才使用
當(dāng)你將一些異步請求壓入隊(duì)列后逻澳,甚至你在執(zhí)行同步請求的時(shí)候闸天,你可以隨時(shí)調(diào)用 cancel 方法來取消請求
Retrofit注解詳解
剛剛已經(jīng)完成了retrofit最基本的快速使用方法,那么接下來就詳細(xì)介紹一下retrofit的注解,retrofit里面有很多注解,是一個(gè)很輕量級(jí)的庫,
一共37個(gè)類就有22個(gè)是注解類,所以大家這一塊一定要仔細(xì)認(rèn)真的看一下.
- 請求方法類
@PATCH、@OPTIONS斜做、@HTTP苞氮、@HEAD、@PUT瓤逼、@GET笼吟、@PUT、@DELETE
方法注解和RESTFUL API有關(guān)
@PUT霸旗,PUT方法用來創(chuàng)建一個(gè)URI已知的資源贷帮,或?qū)σ阎Y源進(jìn)行完全替換,比如users/1诱告,因此PUT方法一般會(huì)用來更新一個(gè)已知資源撵枢,
除非在創(chuàng)建前,你完全知道自己要?jiǎng)?chuàng)建的對(duì)象的URI精居。
@PATCH 锄禽,PATCH方法是新引入的,是對(duì)PUT方法的補(bǔ)充靴姿,用來對(duì)已知資源進(jìn)行局部更新
@HEAD 沃但,與參數(shù)注解@Header不同,只請求頁面的首部空猜。
@OPTIONS 允許客戶端查看服務(wù)器的性能
@HTTP ,使用用戶自定義的verb進(jìn)行網(wǎng)絡(luò)請求
-
標(biāo)記類
@FormUrlEncoded绽慈、@Multipart、@Streaming辈毯。
@FormUrlEncoded 請求體是 From 表單
@Multipart 請求體是支持文件上傳的 From 表單
@Streaming 響應(yīng)體的數(shù)據(jù)用流的形式返回
-
參數(shù)類
@Headers坝疼、@Header、@Body谆沃、@Field钝凶、@FieldMap、@Part唁影、@PartMap@耕陷、Path、@Query据沈、@QueryMap哟沫、@Url
@Headers:使用 @Headers 注解設(shè)置固定的請求頭,所有請求頭不會(huì)相互覆蓋锌介,即使名字相同嗜诀。
@Header: 使用 @Header 注解動(dòng)態(tài)更新請求頭猾警,匹配的參數(shù)必須提供給 @Header ,若參數(shù)值為 null 隆敢,這個(gè)頭會(huì)被省略发皿,否則,會(huì)使用參數(shù)值的 toString 方法的返回值拂蝎。
@Body: 使用 @Body 注解穴墅,指定一個(gè)對(duì)象作為 request body 。
@Field: 表單提交温自,如登錄
@FieldMap 玄货、@Part 、@PartMap 捣作、@Path: 請求 URL 可以替換模塊來動(dòng)態(tài)改變誉结,替換模塊是 {}包含的字母數(shù)字字符串,替換的參數(shù)必須使用 @Path 注解的相同字符串券躁。
@Query: 查詢參數(shù)
@QueryMap: 復(fù)雜的查詢參數(shù)
@Url: 作用于方法參數(shù),用于添加請求的接口地址
Bean對(duì)象轉(zhuǎn)換
要自定義Converter<F, T>,需要先看一下GsonConverterFactory的實(shí)現(xiàn)掉盅,
GsonConverterFactory實(shí)現(xiàn)了內(nèi)部類Converter.Factory也拜。
其中GsonConverterFactory中的主要兩個(gè)方法,主要用于解析request和response的趾痘,
在Factory中還有一個(gè)方法stringConverter慢哈,用于String的轉(zhuǎn)換。
引入Gson支持:
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
通過GsonConverterFactory為Retrofit添加Gson支持:
Gson gson = new GsonBuilder()
//配置你的Gson
.setDateFormat("yyyy-MM-dd hh:mm:ss")
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:4567/")
//可以接收自定義的Gson永票,當(dāng)然也可以不傳
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
然后通過 Call<ResponseBody> 這里替換ResponseBody 為自己的Bean對(duì)象Call<JavaBean> 然后請求回來的數(shù)據(jù)就會(huì)自動(dòng)轉(zhuǎn)換.
結(jié)合okhttp,并使用Interceptor
對(duì)應(yīng)依賴:
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
testImplementation 'com.squareup.okhttp3:mockwebserver:3.9.1'
Retrofit 2.0 底層依賴于okHttp卵贱,所以需要使用okHttp的Interceptors 來對(duì)所有請求進(jìn)行攔截。
我們可以通過自定義Interceptor來實(shí)現(xiàn)很多操作,打印日志,緩存,重試等等侣集。
要實(shí)現(xiàn)自己的攔截器需要有以下步驟
//創(chuàng)建OkHttpClient
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor())
.build();
retrofit = new Retrofit.Builder()
.baseUrl(Urls.baseUrl)
.client(client)//添加自定義OkHttpClient
.build();
如何結(jié)合RxJava
引入RxJava支持:
//這里支持的是RxJava2
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile "io.reactivex.rxjava2:rxjava:2.1.7"
如何添加:
retrofit = new Retrofit.Builder()
.baseUrl(Urls.baseUrl)
// 針對(duì)rxjava2.x
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
在請求的接口中直接指定Observable 的Rxjava對(duì)象:
public interface Api{
@POST("/page")
Observable<Event1> getBook();
}
然后在通過以下代碼完成一套行云流水的結(jié)合操作:
Retrofit retrofit= new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
API movieService = retrofit.create(API.class);
movieService.getTest()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Event1>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MovieEntity movieEntity) {
}
});
這樣完成了Retrofit和Rxjava的結(jié)合,這只是最基本的操作,更多操作還需要大家多多練習(xí),提升自己,方能想怎么玩就怎么玩!
這是官方文檔,想要深入研究的小伙伴可以好好學(xué)一波,加油!
Retrofit官方文檔