1、项目使用的是Okhttp3 + Retrofit2来实现网络请求服务。
Okhttp初始代码:
@Module
public class ApiServiceModule {
private static final int DEFAULT_CONNECT_TIME_OUT = 30;//连接超时时间
private static final int DEFAULT_READ_TIME_OUT = 30;//读取时间
private static final int DEFAULT_WRITE_TIME_OUT = 30;//读取时间
@Singleton
@Provides
protected APIService provideService() {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(DEFAULT_CONNECT_TIME_OUT, TimeUnit.SECONDS)
.readTimeout(DEFAULT_READ_TIME_OUT, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_WRITE_TIME_OUT, TimeUnit.SECONDS)
.addInterceptor(chain -> {
Request request = chain.request()
.newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("dataType", "json")
.addHeader("charset", "utf-8")
.addHeader("appType", BuildConfig.appType)
.addHeader("userID", CommonUtil.getUserID())
.addHeader(Constants.API_HEADER_NAME_TOKEN, (String) SharedPreferencesUtil.getData(Constants.SHARED_PREFERENCES_TOKEN_KEY, Constants.SHARED_PREFERENCES_TOKEN_DEF_VALUE))
.build();
return chain.proceed(request);
}).addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.build();
Retrofit.Builder mBuilder = new Retrofit.Builder();
mBuilder.baseUrl(BuildConfig.baseUrl);
Retrofit retrofit = mBuilder
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())// 添加Rx适配器
.addConverterFactory(GsonConverterFactory.create()) // 添加Gson转换器
.client(client)
.build();
return retrofit.create(APIService.class);
}
}
初始的请求地址保存在gradle.properties文件中:
# develop
URI_DEVELOP=http://192.168.1.101:8088/test
2、要在Android中使用OkHttp和Retrofit,并在满足某个条件时触发OkHttp拦截器修改请求的IP和端口。
具体的操作步骤如下:
① 我这里实现的是登录之后切换IP地址,对应的Bean如下:
public class UrlBo {
private String newIp;
private String newPort;
public String getNewIp() {
return newIp;
}
public void setNewIp(String newIp) {
this.newIp = newIp;
}
public String getNewPort() {
return newPort;
}
public void setNewPort(String newPort) {
this.newPort = newPort;
}
}
② MyApplication文件新增如下代码:
private static UrlBo url;
public static UrlBo getUrl() {
return url;
}
public static void setUrl(UrlBo url) {
MyApplication.url = url;
}
③ Activity新增测试代码:
UrlBo url = new UrlBo();
url.setNewIp("192.168.1.101");
url.setNewPort("8091");
MyApplication.setUrl(url);
④ 创建拦截器,实现Interceptor接口,并且重写intercept方法(具体的判断逻辑写在这里面):
import android.util.Log;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import cn.hk.testapp.MyApplication;
import cn.hk.testapp.model.bo.UrlBo;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class ChangeUrlInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
// 根据条件判断是否需要修改请求的IP和端口
UrlBo url = MyApplication.getUrl();
if(null != url){
String newPath = request.url().toString();
//替换IP地址和端口号
Pattern pattern = Pattern.compile("(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}):(\\d+)");
Matcher matcher = pattern.matcher(newPath);
if(matcher.find()){
newPath = newPath.replace(matcher.group(0), url.getNewIp() + ":" + url.getNewPort());
}
Log.e("newPath", newPath);
request = request.newBuilder().url(newPath).build();
}
return chain.proceed(request);
}
}
⑤ Okhttp初始化代码修改(新增拦截器):
@Singleton
@Provides
protected APIService provideService() {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(DEFAULT_CONNECT_TIME_OUT, TimeUnit.SECONDS)
.readTimeout(DEFAULT_READ_TIME_OUT, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_WRITE_TIME_OUT, TimeUnit.SECONDS)
.addInterceptor(chain -> {
Request request = chain.request()
.newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("dataType", "json")
.addHeader("charset", "utf-8")
.addHeader("appType", BuildConfig.appType)
.addHeader("userID", CommonUtil.getUserID())
.addHeader(Constants.API_HEADER_NAME_TOKEN, (String) SharedPreferencesUtil.getData(Constants.SHARED_PREFERENCES_TOKEN_KEY, Constants.SHARED_PREFERENCES_TOKEN_DEF_VALUE))
.build();
return chain.proceed(request);
}).addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.addInterceptor(new ChangeUrlInterceptor())
.build();
Retrofit.Builder mBuilder = new Retrofit.Builder();
mBuilder.baseUrl(BuildConfig.baseUrl);
Retrofit retrofit = mBuilder
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())// 添加Rx适配器
.addConverterFactory(GsonConverterFactory.create()) // 添加Gson转换器
.client(client)
.build();
return retrofit.create(APIService.class);
}