Android——Retrofit踩坑記
近期公司的項(xiàng)目Retrofit更新到了2.4,使用時(shí)無非是通過注解的方式對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行了包裝,剛開始寫的時(shí)候踩到一個(gè)哭笑不得的坑,記下來也方便大家,不要被這個(gè)小坑耽誤了時(shí)間...
問題
現(xiàn)需訪問一個(gè)接口,形式如:http://www.a.com/v1/search;
了解retrofit2.0及以上版本的同學(xué)都知道訪問的URL最基本的方法是通過baseUrl("")方法加注解中POST("...")里的內(nèi)容組合而成,即:
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://www.a.com/").build();
//切記,baseUrl一定要以"/"結(jié)尾,否則會(huì)報(bào)錯(cuò)
加上:
public interface TestService {
@POST("/v1/search")
@FormUrlEncoded
Call<ResponseBody> getCall(@FieldMap Map<String,String> params);
}
這樣,通過下面語句構(gòu)成的網(wǎng)絡(luò)請(qǐng)求的地址就為:http://www.a.com/v1/search,沒毛病
TestService testService = retrofit.create(TestService .class);
但是出于一些動(dòng)靜態(tài)情況可能你的Url你希望這樣寫:
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://www.a.com/v1/").build();
public interface TestService {
@POST("/search")
@FormUrlEncoded
Call<ResponseBody> getCall(@FieldMap Map<String,String> params);
}
看上去和第一種情況沒什么太大差別,只是把url中的"v1"放到baseUrl中而已,但是如果你這么寫了,服務(wù)器卻沒有返回你想要的數(shù)據(jù)給你,千萬不要大驚小怪,因?yàn)檫@樣寫之后,最后形成的url并不是"http://www.a.com/v1/search",而是"http://www.a.com/search"!
原因
作者一開始簡(jiǎn)直蒙蔽了,不相信自己的眼睛,查閱資料后才明確到,結(jié)點(diǎn)url(/search)的前面是一個(gè) / 符號(hào),這個(gè)將會(huì)只添加到baseUrl的host上面。也就是說當(dāng)我們?cè)诮Y(jié)點(diǎn)url上添加一個(gè)前置 / 符號(hào)時(shí),每個(gè)加到host Url后面的東西都會(huì)被省略掉,所以上面的"v1"就被省略掉了,所以正確的書寫方式應(yīng)該為:
public interface TestService {
@POST("search")
@FormUrlEncoded
Call<ResponseBody> getCall(@FieldMap Map<String,String> params);
}
而當(dāng)你的baseUrl只包含host地址,如"http://www.a.com/",你的結(jié)點(diǎn)url前面加不加 / 都沒關(guān)系。
一個(gè)小小的"/",卻很可能耽誤你的時(shí)間,不去了解retrofit的這些細(xì)節(jié)還真不知道錯(cuò)在哪里。
這個(gè)小坑就分享到這,使用過程中大家還遇到什么問題,也歡迎在評(píng)論里留言討論~