Android——Retrofit踩坑记
近期公司的项目Retrofit更新到了2.4,使用时无非是通过注解的方式对网络请求进行了包装,刚开始写的时候踩到一个哭笑不得的坑,记下来也方便大家,不要被这个小坑耽误了时间…
问题
现需访问一个接口,形式如:http://www.a.com/v1/search;
了解retrofit2.0及以上版本的同学都知道访问的URL最基本的方法是通过baseUrl(“”)方法加注解中POST(“…”)里的内容组合而成,即:
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://www.a.com/").build();
//切记,baseUrl一定要以"/"结尾,否则会报错
加上:
public interface TestService {
@POST("/v1/search")
@FormUrlEncoded
Call<ResponseBody> getCall(@FieldMap Map<String,String> params);
}
这样,通过下面语句构成的网络请求的地址就为:http://www.a.com/v1/search,没毛病
TestService testService = retrofit.create(TestService .class);
但是出于一些动静态情况可能你的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中而已,但是如果你这么写了,服务器却没有返回你想要的数据给你,千万不要大惊小怪,因为这样写之后,最后形成的url并不是”http://www.a.com/v1/search“,而是”http://www.a.com/search“!
原因
作者一开始简直蒙蔽了,不相信自己的眼睛,查阅资料后才明确到,结点url(/search)的前面是一个 / 符号,这个将会只添加到baseUrl的host上面。也就是说当我们在结点url上添加一个前置 / 符号时,每个加到host Url后面的东西都会被省略掉,所以上面的”v1”就被省略掉了,所以正确的书写方式应该为:
public interface TestService {
@POST("search")
@FormUrlEncoded
Call<ResponseBody> getCall(@FieldMap Map<String,String> params);
}
而当你的baseUrl只包含host地址,如”http://www.a.com/“,你的结点url前面加不加 / 都没关系。
一个小小的”/”,却很可能耽误你的时间,不去了解retrofit的这些细节还真不知道错在哪里。
这个小坑就分享到这,使用过程中大家还遇到什么问题,也欢迎在评论里留言讨论~