Android Okhttp+Retrofit 根据条件切换请求路径实现

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);
}

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值