Retrofit请求更换baseUrl以及源码分析

本文详细介绍了如何在Retrofit中根据接口需求更换不同的BaseUrl,通过自定义拦截器实现动态设置BaseUrl,并深入剖析了Retrofit和OkHttp的拦截器链工作原理,以及请求的执行流程。
摘要由CSDN通过智能技术生成
  • 一般一个应用都只创建一个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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值