All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dxy.library.network.http.requester.OkHttpRequester Maven / Gradle / Ivy

The newest version!
package com.dxy.library.network.http.requester;

import com.dxy.library.json.gson.GsonUtil;
import com.dxy.library.network.http.builder.OkBuilder;
import com.dxy.library.network.http.callback.RequestCallback;
import com.dxy.library.network.http.constant.Method;
import com.dxy.library.network.http.header.Headers;
import com.dxy.library.network.http.param.FileParam;
import com.dxy.library.network.http.param.Params;
import com.dxy.library.network.http.util.FileUtils;
import com.dxy.library.network.http.util.StreamUtils;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.*;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * OkHttp请求实例
 * @author duanxinyuan
 * 2016/9/28 13:15
 */
@Slf4j
public final class OkHttpRequester extends BaseRequester {

    private volatile static OkHttpClient httpClient;

    public OkHttpRequester(boolean isLog, int timeout) {
        super(isLog, timeout);
    }

    private OkHttpClient getOkHttpClient() {
        if (null == httpClient) {
            synchronized (OkHttpClient.class) {
                if (null == httpClient) {
                    httpClient = newClient(timeout);
                }
            }
        }
        return httpClient;
    }

    @Override
    public void setTimeout(int timeout) {
        super.setTimeout(timeout);
        httpClient = newClient(timeout);
    }

    private OkHttpClient newClient(long timeout) {
        OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
        builder.connectTimeout(timeout, TimeUnit.SECONDS);
        builder.readTimeout(timeout, TimeUnit.SECONDS);
        builder.writeTimeout(timeout, TimeUnit.SECONDS);
        try {
            //配置忽略SSL证书
            X509TrustManager trustManager = new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] x509Certificates, String s) { }

                @Override
                public void checkServerTrusted(X509Certificate[] x509Certificates, String s) { }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            };
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{trustManager}, null);
            HostnameVerifier doNotVerify = (hostname, session) -> true;
            builder.sslSocketFactory(sslContext.getSocketFactory(), trustManager).hostnameVerifier(doNotVerify);
        } catch (Exception e) {
            if (isLog) {
                log.error("ssl certificate config error", e);
            }
        }
        return builder.build();
    }

    /**
     * 异步请求
     */
    @Override
    public  void enqueue(Method method, String url, Headers headers, Params params, T t, List fileParams, RequestCallback callback) {
        OkBuilder builder = OkBuilder.builder(method, url, headers, params, t, fileParams);
        if (builder == null) {
            return;
        }
        getOkHttpClient().newCall(builder.build()).enqueue(new Callback() {

            @Override
            public void onFailure(Call call, IOException e) {
                //log
                if (isLog) {
                    logResult(url, method, params, headers, t, ERROR_CODE, e);
                }
                if (null == callback || CANCELED.equals(e.getMessage())) {
                    //Http请求已经取消
                    return;
                }
                callback.failure(e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                ResponseBody responseBody = response.body();
                String responseStr = null;
                if (responseBody != null) {
                    responseStr = responseBody.string();
                    responseBody.close();
                }
                //log
                if (isLog) {
                    logResult(url, method, params, headers, t, response.code(), null);
                }
                if (response.isSuccessful()) {
                    if (callback != null) {
                        callback.success(responseStr);
                    }
                } else {
                    if (null == callback || CANCELED.equals(responseStr)) {
                        //Http请求已经取消
                        return;
                    }
                    callback.failure(responseStr);
                }
            }
        });
    }

    /**
     * 同步请求
     */
    @Override
    public  V excute(Method method, String url, Headers headers, Params params, T t, List fileParams, Type type) {
        OkBuilder builder = OkBuilder.builder(method, url, headers, params, t, fileParams);
        if (builder == null) {
            return null;
        }
        try {
            Response response = getOkHttpClient().newCall(builder.build()).execute();
            //log
            if (isLog) {
                logResult(url, method, params, headers, t, response.code(), null);
            }
            ResponseBody body = response.body();
            if (body == null) {
                return null;
            }
            V v = null;
            try {
                if (byte[].class == type || Byte[].class == type) {
                    v = (V) body.bytes();
                } else if (String.class == type) {
                    v = (V) body.string();
                } else if (InputStream.class == type) {
                    InputStream inputStream = StreamUtils.cloneInputStream(body.byteStream());
                    v = (V) inputStream;
                } else if (Reader.class == type) {
                    InputStream inputStream = StreamUtils.cloneInputStream(body.byteStream());
                    MediaType contentType = body.contentType();
                    Charset charset = contentType != null ? contentType.charset(StandardCharsets.UTF_8) : StandardCharsets.UTF_8;
                    if (null == charset) {
                        charset = StandardCharsets.UTF_8;
                    }
                    if (inputStream != null) {
                        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, charset);
                        v = (V) inputStreamReader;
                    } else {
                        return null;
                    }
                } else {
                    v = GsonUtil.from(body.string(), type);
                }
            } catch (Exception e) {
                logResult(url, method, params, headers, t, response.code(), e);
            }
            body.close();
            return v;
        } catch (IOException e) {
            //log
            if (isLog) {
                logResult(url, method, params, headers, t, ERROR_CODE, e);
            }
            return null;
        }
    }

    /**
     * 下载文件到本地
     */
    @Override
    public void download(String url, String targetPath, boolean isAsync) {
        if (isAsync) {
            getOkHttpClient().newCall(new Request.Builder().url(url).build()).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    if (isLog) {
                        log.error("download error, url: {}, targetPath: {}, isAsync: {}", url, targetPath, isAsync, e);
                    }
                }

                @Override
                public void onResponse(Call call, Response response) {
                    writeFile(response, targetPath);
                }
            });
        } else {
            try {
                Response response = getOkHttpClient().newCall(new Request.Builder().url(url).build()).execute();
                writeFile(response, targetPath);
            } catch (IOException e) {
                if (isLog) {
                    log.error("download error, url: {}, targetPath: {}, isAsync: {}", url, targetPath, isAsync, e);
                }
            }
        }
    }

    private void writeFile(Response response, String targetPath) {
        if (!response.isSuccessful()) {
            if (isLog) {
                log.error("download failed, url: {}, code: {}", response.request().url().toString(), response.code());
            }
            response.close();
            return;
        }
        ResponseBody body = response.body();
        if (body == null) {
            if (isLog) {
                log.error("downloaded resource body is null");
            }
            return;
        }
        FileUtils.createFile(targetPath);
        try (FileOutputStream fileOutputStream = new FileOutputStream(new File(targetPath));
             InputStream inputStream = body.byteStream()) {
            int readLength;
            byte[] buffer = new byte[4 * 1024];
            while ((readLength = inputStream.read(buffer)) != -1) {
                fileOutputStream.write(buffer, 0, readLength);
            }
        } catch (IOException e) {
            if (isLog) {
                log.error("downloaded resource write to local error", e);
            }
        } finally {
            body.close();
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy