java使用OKhttp在具体请求中设置超时时间

3,703 阅读1分钟

在request中利用tag带上具体的超时参数,之后在超时拦截器处理。

单例请求client:

public class RequestClient {
    private static volatile OkHttpClient instance;

    private RequestClient() {
    }

    public static OkHttpClient getInstance() {
        if (Objects.isNull(instance)) {
            synchronized (RequestClient.class) {
                if (Objects.isNull(instance)) {
                    instance = new OkHttpClient.Builder()
                            .retryOnConnectionFailure(true)
                            .connectTimeout(10000, TimeUnit.SECONDS) //连接超时
                            .readTimeout(10000, TimeUnit.SECONDS) //读取超时
                            .writeTimeout(10000, TimeUnit.SECONDS) //写超时
                            .addInterceptor(new TimeOutInterceptor())
                            .build();
                }
            }
        }
        return instance;
    }
}

TimeOutConfig:


public class TimeOutConfig {

    public Integer socketConnectionTime;

    public TimeOutConfig(Integer socketConnectionTime) {
        this.socketConnectionTime = socketConnectionTime;
    }
}

超时拦截器:

public class TimeOutInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        TimeOutConfig tag = (TimeOutConfig) request.tag(TimeOutConfig.class);
        if (Objects.nonNull(tag)) {
            return chain.withConnectTimeout(tag.socketConnectionTime, TimeUnit.MILLISECONDS)
                    .proceed(request);
        }
        return chain.proceed(request);
    }
}

demo:

public class RequestDemo {

    public static void main(String[] args) {
        OkHttpClient client = RequestClient.getInstance();
        TimeOutConfig timeOutConfig = new TimeOutConfig(1);
        Request request = new Request.Builder()
                .url("https://github.com")
                .tag(timeOutConfig)
                .build();
        Call call = client.newCall(request);
        try (Response response = call.execute()) {
            if (response.isSuccessful()) {
                System.out.println(response.body().string());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

也可以用注解的方式。但实现方式不同。