Retrofit simple package supports multiple domain names

retrofit simple package

dependent library

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'

Tools

public class RetrofitUtils {

    private static ApiService apiService;
    public Handler mHandler = new Handler(Looper.getMainLooper());

    private static final class Holder {
        private static final RetrofitUtils INSTANCE = new RetrofitUtils();
    }
    public static RetrofitUtils getInstance() {
        return Holder.INSTANCE;
    }

    public static ApiService Api() {
        if(apiService == null){
            OkHttpClient client = new OkHttpClient.Builder()
                      //处理多BaseUrl,添加应用拦截器
                    .addInterceptor(new MoreBaseUrlInterceptor())
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(10, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(true)
                    .build();
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(ServerAddressManager.GET_TST_DMAIN)
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            apiService = retrofit.create(ApiService.class);
        }
        return apiService;
    }

    public <T> void requestData(Call<T> call, final ServerCallBack<T> serverCallBack) {
        call.enqueue(new Callback<T>() {
            @Override
            public void onResponse(final Call<T> call, final Response<T> response) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverCallBack.onSuccess(response.body(), response.message(), response.code());
                    }
                });
            }

            @Override
            public void onFailure(final Call<T> call, final Throwable t) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverCallBack.onFailure(call, t);
                    }
                });
            }
        });
    }
    public interface ServerCallBack<T> {

        void onSuccess(T t, String msg, long code);

        void onFailure(Call call, Throwable throwable);

    }


    public static class MoreBaseUrlInterceptor implements Interceptor {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            //获取原始的originalRequest
            Request originalRequest = chain.request();
            //获取老的url
            HttpUrl oldUrl = originalRequest.url();
            //获取originalRequest的创建者builder
            Request.Builder builder = originalRequest.newBuilder();
            //获取头信息的集合如:manage,mdffx
            List<String> urlnameList = originalRequest.headers("urlname");
            if (urlnameList != null && urlnameList.size() > 0) {
                //删除原有配置中的值,就是namesAndValues集合里的值
                builder.removeHeader("urlname");
                //获取头信息中配置的value,如:manage或者mdffx
                String urlname = urlnameList.get(0);
                HttpUrl baseURL=null;
                //根据头信息中配置的value,来匹配新的base_url地址
                if ("manage".equals(urlname)) {
                    baseURL = HttpUrl.parse(ServerAddressManager.GET_TST_DMAIN);
                } else if ("mdffx".equals(urlname)) {
                    baseURL = HttpUrl.parse(ServerAddressManager.GET_TST_DMAIN2);
                }
                //重建新的HttpUrl,需要重新设置的url部分
                HttpUrl newHttpUrl = oldUrl.newBuilder()
                        .scheme(baseURL.scheme())//http协议如:http或者https
                        .host(baseURL.host())//主机地址
                        .port(baseURL.port())//端口
                        .build();
                //获取处理后的新newRequest
                Request newRequest = builder.url(newHttpUrl).build();
                return  chain.proceed(newRequest);
            }else{
                return chain.proceed(originalRequest);
            }

        }
    }
}
ApiService
public interface  ApiService {
    @Headers({"urlname:manage"})//这个是修改域名的 
    @POST("index/xxx")
    Call <BaseModel<TestBean>> getTest(@Query("app") String app);
}

API_test 

public class API_test {
    private static volatile API_test api = null;


    public static API_test ins() {
        if (api == null) {
            synchronized (API_test.class) {
                if (api == null) {
                    api = new API_test();
                }
            }
        }
        return api;
    }


    public void getTopicList( String app,RetrofitUtils.ServerCallBack<BaseModel<TestBean>> serverCallBack) {

        RetrofitUtils.getInstance().requestData(RetrofitUtils.Api().getTest(app), serverCallBack);
    }

}

 

use in activity

 

private void initData() {


    API_test.ins().getTopicList("",new RetrofitUtils.ServerCallBack<BaseModel<TestBean>>() {
        @Override
        public void onSuccess(BaseModel<TestBean> testBean, String msg, long code) {
            if (code == 200) {
                Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void onFailure(retrofit2.Call call, Throwable throwable) {
            Toast.makeText(MainActivity.this, "失败", Toast.LENGTH_SHORT).show();
        }
    });


}

BaseModel is a custom bean base class, so please correct me, if there is any infringement, please contact me

Multi-domain reference  https://www.2cto.com/kf/201708/663977.html

 

 

Guess you like

Origin blog.csdn.net/cao2884388/article/details/115916203