1.给Retrofit添加BaseUrlManagerInterceptor拦截器。
private static final String TAG = "RetrofitManager";
private static RetrofitManager manager;
private Retrofit retrofit;
/**
* 私有构造器 无法外部创建
* 初始化必要对象和参数
*/
private RetrofitManager() {
// 初始化okhttp
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(5 * 1000, TimeUnit.MILLISECONDS)
.readTimeout(5 * 1000, TimeUnit.MILLISECONDS)
.writeTimeout(5 * 1000, TimeUnit.MILLISECONDS)
.addInterceptor(new BaseUrlManagerInterceptor(BaseApplication.getInstance()))
.proxy(Proxy.NO_PROXY)
.build();
// 初始化Retrofit
retrofit = new Retrofit.Builder()
.client(client)
.baseUrl(ConstantUrl.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
public static RetrofitManager getInstance() {
if (manager == null) {
synchronized (RetrofitManager.class) {
if (manager == null) {
manager = new RetrofitManager();
}
}
}
return manager;
}
public Retrofit getRetrofit() {
return retrofit;
}
//创建一个拦截器
public class BaseUrlManagerInterceptor implements Interceptor {
private static final String TAG = "BaseUrlManagerInterceptor";
private BaseApplication baseApplication;
public BaseUrlManagerInterceptor(BaseApplication baseApplication) {
super();
this.baseApplication = baseApplication;
}
@Override
public Response intercept(Chain chain) throws IOException {
//获取原始的originalRequest
Request originalRequest = chain.request();
//获取originalRequest的创建者builder
Request.Builder builder = originalRequest.newBuilder();
//获取当前的url
HttpUrl oldUrl = originalRequest.url();
LogManager.i(TAG, "intercept:------------oldUrl---------->" + oldUrl);
//获取头信息的集合如:jeapp ,njeapp ,mall
List<String> urlnameList = originalRequest.headers("urlname");
if (urlnameList != null && urlnameList.size() > 0) {
//删除原有配置中的值,就是namesAndValues集合里的值
builder.removeHeader("urlname");
//获取头信息中配置的value,如:manage或者mdffx
String urlname = urlnameList.get(0);
LogManager.i(TAG, "intercept:-------urlname------" + urlname);
HttpUrl baseURL = null;
//根据头信息中配置的value,来匹配新的base_url地址
if (!TextUtils.isEmpty(urlname)) {
switch (urlname) {
case ConstantData.TO_FIRST_PAGR_FLAG:
baseURL = HttpUrl.parse(ConstantData.TO_FIRST_PAGR_URL);
break;
case ConstantData.TO_PROJECT_FLAG:
baseURL = HttpUrl.parse(ConstantData.TO_PROJECT_URL);
break;
// case ConstantData.TO_PROJECT_FLAG:
// baseURL = HttpUrl.parse(ConstantData.TO_PROJECT_URL);
// break;
case ConstantData.TO_RESOURCE_FLAG:
baseURL = HttpUrl.parse(ConstantData.TO_RESOURCE_URL);
break;
case ConstantData.TO_MINE_FLAG:
baseURL = HttpUrl.parse(ConstantData.TO_MINE_URL);
break;
case ConstantData.TO_USER_DATA_FLAG:
baseURL = HttpUrl.parse(ConstantData.TO_USER_DATA_URL);
break;
default:
break;
}
// if ("jeapp".equals(urlname)) {
// baseURL = HttpUrl.parse(ConstantData.PRE_URL);
// } else if ("njeapp".equals(urlname)) {
// baseURL = HttpUrl.parse(ConstantData.PRE_NEW_URL);
// } else if ("mall".equals(urlname)) {
// baseURL = HttpUrl.parse(ConstantData.MALL_URL);
// }
LogManager.i(TAG, "intercept:-----oldUrl-----" + oldUrl.toString());
//重建新的HttpUrl,需要重新设置的url部分
HttpUrl newHttpUrl = oldUrl.newBuilder()
.scheme(baseURL.scheme())//http协议如:http或者https
.host(baseURL.host())//主机地址
.port(baseURL.port())//端口
.build();
LogManager.i(TAG, "intercept:------scheme----" + baseURL.scheme());
LogManager.i(TAG, "intercept:-----host-----" + baseURL.host());
LogManager.i(TAG, "intercept:-----port-----" + baseURL.port());
LogManager.i(TAG, "intercept:-----newHttpUrl-----" + newHttpUrl.toString());
//获取处理后的新newRequest
Request.Builder newBuilder = builder.url(newHttpUrl);
Request newRequest = newBuilder.build();
return chain.proceed(newRequest);
}
originalRequest = builder.build();
return chain.proceed(originalRequest);
} else {
originalRequest = builder.build();
return chain.proceed(originalRequest);
}
}
}
2.添加请求的头部信息
@Headers("urlname:" + ConstantData.TO_FIRST_PAGR_FLAG)
@GET(ConstantUrl.FIRST_PAGE_DETAILS_URL)
Observable<ResponseBody> getFirstPageDetails(@QueryMap Map<String, String> bodyParams);
//常量类
public class ConstantData {
public static final String TO_FIRST_PAGR_FLAG = "FIRST_PAGR_FLAG";
public static final String TO_PROJECT_FLAG = "PROJECT_FLAG";
public static final String TO_RESOURCE_FLAG = "RESOURCE_FLAG";
public static final String TO_MINE_FLAG = "MINE_FLAG";
public static final String TO_USER_DATA_FLAG = "USER_DATA_FLAG";
public static final String TO_FIRST_PAGR_URL = ConstantUrl.BASE_URL;
public static final String TO_PROJECT_URL = ConstantUrl.BASE_URL3;
public static final String TO_RESOURCE_URL = ConstantUrl.BASE_URL2;
public static final String TO_MINE_URL = ConstantUrl.BASE_URL;
public static final String TO_USER_DATA_URL = ConstantUrl.BASE_URL0;
}
public class ConstantUrl {
//正式地址(此地址无效,请替换)
public static final String BASE_URL0 = "https://is.snssdk.net/";
public static final String BASE_URL = "http://is.snssdk.com/";
public static final String BASE_URL2 = "http://gank.io/";
public static final String BASE_URL3 = "https://wanandroid.com/";
}
添加此拦截器就可以在app在调用不同模块时,发起不同url的请求。如需要完整项目,请联系qq1164688204。
项目功能介绍:RxJava2和Retrofit2项目,添加自动管理token功能,添加RxJava2生命周期管理,使用App架构设计是MVP模式和MVVM模式,同时使用组件化,部分代码使用Kotlin,此项目持续维护中。