Android——Retrofit踩坑记(一)

版权声明:转载请标明出处: https://blog.csdn.net/Sunny_Captain/article/details/82662562

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的这些细节还真不知道错在哪里。
这个小坑就分享到这,使用过程中大家还遇到什么问题,也欢迎在评论里留言讨论~

猜你喜欢

转载自blog.csdn.net/Sunny_Captain/article/details/82662562