几个月前单位的一个项目,说要在项目中实现修改域名地址然后请求接口,当时我还问了句,那接口还能用? 后来解释说在本地有一个服务器,把资源传到本地的服务器,然后在本地请求,也就是相当与下面这样的地址
http://公司域名/api/接口地址 // 正常的接口地址
http://192.168.1.176:88/api/接口地址 // 修改后的接口地址 有可能是用户自己输入的
输入本地的 ip 地址 还有端口号 然后加上接口地址请求本地的资源
然后也看了同事的代码,发现里面并不能修改地址,甚至连接口类都不能更改,这个发现顿时头都大了,当时自己还在想 这啥都不能改,封装这个请求有什么用。
但是公司有需求,还是得实现啊,然后就有了下面的代码
/**
* 获取本地ip地址
*/
private static String getServerUrl() {
String baseUrl = SERVER_URL;
String serviceUrl = SPUtils.getInstance(BASE_URL).getString(BASE_URL);
if (!StringUtils.isEmpty(serviceUrl)) {
baseUrl = serviceUrl;
}
return baseUrl;
}
获取用户输入的IP地址或者修改的地址然后配置Retrofit
private RetrofitFactory() {
mOkHttpClientBuilder = new OkHttpClient.Builder();
/**
* 设置缓存
*/
File cacheFile = new File(App.getContext().getExternalCacheDir(), CACHE_NAME);
Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);
mOkHttpClientBuilder.cache(cache);
mOkHttpClientBuilder.addInterceptor(new CacheInterceptor());
// 设置超时时间
mOkHttpClientBuilder.connectTimeout(DEFAULT_CONNECT_TIMEOUT, TimeUnit.SECONDS);
mOkHttpClientBuilder.readTimeout(DEFAULT_READ_TIMEOUT, TimeUnit.SECONDS);
mOkHttpClientBuilder.writeTimeout(DEFAULT_WRITE_TIMEOUT, TimeUnit.SECONDS);
mOkHttpClientBuilder.retryOnConnectionFailure(true); // 连接失败时重试
// 添加日志拦截器
mOkHttpClientBuilder.addInterceptor(loggingInterceptor());
// 添加头部拦截器
mOkHttpClientBuilder.addInterceptor(new HeadersInterceptor());
mOkHttpClient = mOkHttpClientBuilder.build();
changeBaseUrl(getServerUrl());
}
/**
* APi接口服务类
*/
public T create(Class service) {
return mRetrofit.create(service);
}
/**
* 改变baseUrl
*/
public void changeBaseUrl(String baseUrl) {
mRetrofit = new Retrofit.Builder()
.client(mOkHttpClient)
.addConverterFactory(GsonConverterFactory.create(StringTypeGson()))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(baseUrl)
.build();
}
/**
* 支持自己定义事件处理
* 设置订阅 和 所在的线程环境
*/
public void toSubscribe(Observable observable, BaseObserver baseObserver) {
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(baseObserver);
}
调用的几种方式
Map params = new HashMap<>();
params.put("userToken", "c5472bd21ea71229d3e6de99d656affd");
// **********第一种请求
RetrofitManager.getInstance().postData(url, params, BaseResponse.class, new BaseObserver() {
@Override
public void onSucceed(BaseResponse result) {
ToastUtils.showToast("----成功了");
tv_review_result_review_loan.setText("请求成功了");
}
@Override
public void onFailed(int code, String msg) {
ToastUtils.showToast("----失败了");
tv_review_result_review_loan.setText("请求失败了");
}
});
// **********第二种请求
RetrofitManager.toSubscribe(RetrofitManager.getInstance()
.create(ApiService.class)
.getBaseResponse(params), new BaseObserver() {
@Override
public void onSucceed(BaseResponse result) {
ToastUtils.showToast("----成功了");
tv_review_result_review_loan.setText("请求成功了");
}
@Override
public void onFailed(int code, String msg) {
ToastUtils.showToast("----失败了");
tv_review_result_review_loan.setText("请求失败了");
}
});
// **********第三种请求
RetrofitManager.getInstance()
.create(ApiService.class)
.getBaseResponse(params)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
// 下面的用一种就可以
new BaseObserver() {
@Override
public void onSucceed(BaseResponse result) {
ToastUtils.showToast("----成功了");
tv_review_result_review_loan.setText("请求成功了");
}
@Override
public void onFailed(int code, String msg) {
ToastUtils.showToast("----失败了");
tv_review_result_review_loan.setText("请求失败了");
}
}
// new Observer() {
// @Override
// public void onSubscribe(Disposable d) {
//
// }
//
// @Override
// public void onNext(BaseResponse homeBean) {
// ToastUtils.showToast("----成功了");
// tv_review_result_review_loan.setText("请求成功了");
// }
//
// @Override
// public void onError(Throwable e) {
// ToastUtils.showToast("----失败了");
// tv_review_result_review_loan.setText("请求失败了");
// }
//
// @Override
// public void onComplete() {
//
// }
// }
);
可以任意选一中
如果有更好的封装请@我,我也想学习学习
地址:https://github.com/xiaobinAndroid421726260/Android_RetrofitRxJava_Dome_2019_04_22.git