0
点赞
收藏
分享

微信扫一扫

RestClient

若如初梘 2022-04-13 阅读 19
java

一个http客户端,使用OkHttp实现

依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.14.9</version>
</dependency>

实现:


import java.security.cert.X509Certificate;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;

import okhttp3.*;

@SuppressWarnings("ALL")
public class RestClient {

    public static final MediaType JSON_TYPE = MediaType.get("application/json; charset=utf-8");
    public static final String HTTPS = "https";
    public static final String HTTP = "http://";

    public static String post(String url, String queryBody, Map<String, String> headerMap) {
        return doExecute(RequestType.POST, url, queryBody, headerMap);
    }

    public static byte[] postFile(String url, String queryBody, Map<String, String> headerMap) {
        OkHttpClient httpsClient = getHttpClient(url);
        Request.Builder requestBuilder = getRequestBuilder(url, headerMap);
        requestBuilder.post(RequestBody.create(JSON_TYPE, queryBody == null ? "" : queryBody));
        return executeAndGetBytes(httpsClient, requestBuilder);
    }

    public static String delete(String url, Map<String, String> headerMap) {
        return doExecute(RequestType.DELETE, url, null, headerMap);
    }

    public static String put(String url, String queryBody, Map<String, String> headerMap) {
        return doExecute(RequestType.PUT, url, queryBody, headerMap);
    }

    public static String get(String url, Map<String, String> paramMap, Map<String, String> headerMap) {
        OkHttpClient okHttpClient = getHttpClient(url);
        Request.Builder requestBuilder = new Request.Builder();
        buildHeader(requestBuilder, headerMap);
        buildParam(requestBuilder, url, paramMap);
        return executeAndGetResult(okHttpClient, requestBuilder);
    }

    private static String doExecute(RequestType requestType, String url, String queryBody,
        Map<String, String> headerMap) {
        OkHttpClient okHttpClient = getHttpClient(url);
        Request.Builder requestBuilder = getRequestBuilder(url, headerMap);
        RequestBody requestBody = RequestBody.create(JSON_TYPE, queryBody == null ? "" : queryBody);
        switch (requestType) {
            case POST:
                requestBuilder.post(requestBody);
                break;
            case PUT:
                requestBuilder.put(requestBody);
                break;
            case DELETE:
                requestBuilder.delete(requestBody);
                break;
            case GET:
                break;
            default:
                return null;
        }
        return executeAndGetResult(okHttpClient, requestBuilder);
    }

    private static Request.Builder getRequestBuilder(String url, Map<String, String> headerMap) {
        Request.Builder requestBuilder = new Request.Builder();
        requestBuilder.url(url);
        buildHeader(requestBuilder, headerMap);
        return requestBuilder;
    }

    private static String executeAndGetResult(OkHttpClient okHttpClient, Request.Builder requestBuilder) {
        Request request = requestBuilder.build();
        try (Response response = okHttpClient.newCall(request).execute(); ResponseBody responseBody = response.body()) {
            if (responseBody != null) {
                return responseBody.string();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] executeAndGetBytes(OkHttpClient okHttpClient, Request.Builder requestBuilder) {
        Request request = requestBuilder.build();
        try (Response response = okHttpClient.newCall(request).execute(); ResponseBody responseBody = response.body()) {
            if (responseBody != null) {
                return responseBody.bytes();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static OkHttpClient getHttpClient(String url) {
        if (StringUtils.isBlank(url)) {
            return null;
        }
        OkHttpClient.Builder clientBuilder = new OkHttpClient().newBuilder();
        buildTimeOut(clientBuilder);
        if (StringUtils.startsWith(url, HTTP)) {
            return clientBuilder.build();
        }

        try {
            TrustManager[] trustManagers = buildTrustManagers();
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustManagers, new java.security.SecureRandom());
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            clientBuilder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustManagers[0]);
            clientBuilder.hostnameVerifier((hostname, session) -> true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return clientBuilder.build();
    }

    private static void buildTimeOut(OkHttpClient.Builder clientBuilder) {
        clientBuilder.connectTimeout(600L, TimeUnit.SECONDS);
        clientBuilder.readTimeout(600L, TimeUnit.SECONDS);
    }

    private static void buildParam(Request.Builder requestBuilder, String url, Map<String, String> paramMap) {
        if (MapUtils.isEmpty(paramMap)) {
            requestBuilder.url(url);
            return;
        }
        int size = paramMap.size();
        int count = 1;
        StringBuilder paramBuilder = new StringBuilder(url);
        paramBuilder.append("?");
        for (Map.Entry<String, String> entry : paramMap.entrySet()) {
            paramBuilder.append(entry.getKey()).append("=").append(entry.getValue());
            if (count < size) {
                paramBuilder.append("&");
            }
            count++;
        }
        requestBuilder.url(paramBuilder.toString());
    }

    private static void buildHeader(Request.Builder builder, Map<String, String> headerMap) {
        if (MapUtils.isEmpty(headerMap)) {
            return;
        }
        headerMap.forEach(builder::addHeader);
    }

    private static TrustManager[] buildTrustManagers() {
        return new TrustManager[] {new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) {

            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) {

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }};
    }

    enum RequestType {
        POST("post"), DELETE("delete"), PUT("put"), GET("get");

        String name;

        RequestType(String name) {
            this.name = name;
        }
    }

}
举报

相关推荐

0 条评论