-
一般一个应用都只创建一个Retrofit实例,但是当碰到需要的网络请求的baseUrl不止一个的时候,就要考虑如何给retrofit对象根据不同的请求接口更换不同的baseUrl了。
-
实现方法
//创建retrofit对象 private void initRetrofit(final Context context) { // 设置超时 builder.retryOnConnectionFailure(true).connectTimeout(60,TimeUnit.SECONDS); builder.readTimeout(TIMEOUT, TimeUnit.SECONDS); builder.writeTimeout(TIMEOUT, TimeUnit.SECONDS); //设置替换baseUrl拦截器,更换baseUrl是通过这个拦截器实现的 builder.addInterceptor(new ChangeBaseUrlInterceptor()); OkHttpClient client = builder.build(); mRetrofit = new Retrofit.Builder() // 设置请求的域名,这个是初始的baseUrl .baseUrl(BASE_URL) // 设置解析转换工厂,用自己定义的 .addConverterFactory(ResponseConvert.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(client) .build(); } /** * 创建API */ public <T> T create(Class<T> clazz) { return mRetrofit.create(clazz); }
下面看一下ApiService的接口是怎么实现的
//获取扫码状态(二维码过期,扫码成功,扫码失败) @Headers({"domin:common"}) @GET("/cgi-bin/mmwebwx-bin/login") Call<ResponseBody> getLoginStatus(@Query("loginicon") boolean loginicon, @Query("uuid") String uuid, @Query("tip") int tip, @Query("r") long r, @Query("_") long time); //上传好友信息到后台服务器 @Headers({"domin:updatecontacts"}) @POST("/api/wechat/status/change") Call<ResponseBody> updateContacts(@Body RequestBody body); //登录微信 @Headers({"domin:login"}) @GET("/cgi-bin/mmwebwx-bin/webwxnewloginpage") Call<ResponseBody> webLoginWeixin(@Query("ticket") String ticket, @Query("uuid") String uuid, @Query("lang") String lang, @Query("scan") String scan, @Query("fun") String fun, @Query("r")long r); //登录微信(因为微信的baseUrl有两个) @Headers({"domin:loginother"}) @GET("/cgi-bin/mmwebwx-bin/webwxnewloginpage") Call<ResponseBody> webLoginWeixinT(@Query("ticket") String ticket, @Query("uuid") String uuid, @Query("lang") String lang, @Query("scan") String scan, @Query("fun") String fun, @Query("r")long r); //登录成功初始化微信 @Headers({"domin:init"}) @POST("/cgi-bin/mmwebwx-bin/webwxinit") Call<ResponseBody> webinitWeixin(@Query("r") long t, @Query("pass_ticket") String pass_ticket, @Body RequestBody body);
这五个接口的baseUrl都是不一样的,怎么区分呢,通过给接口添加注解,设置其请求头属性domin的值
下面看一下自定义拦截器是怎么根据请求头的domin属性更换为每个接口更换baseUrl的public class ChangeBaseUrlInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { //获取request Request request = chain.request(); //从request中获取原有的HttpUrl实例oldHttpUrl HttpUrl oldHttpUrl = request.url(); //获取request的创建者builder Request.Builder builder = request.newB
Retrofit请求更换baseUrl以及源码分析
最新推荐文章于 2024-04-11 08:50:46 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)