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