java通过okhttp方式实现https请求的工具类(绕过证书验证)

目录

一、引入依赖包

  • 引入相关依赖包

    java 复制代码
    <!--okhttp依赖包-->
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>4.10.0</version>
    </dependency>
    <!--lombok用于简化实体类开发-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

二、okhttp方式实现的https请求工具类

2.1、跳过证书配置类

  • 跳过证书配置类代码

    java 复制代码
    package com.xz.https;
    import okhttp3.OkHttpClient;
    
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    import java.security.KeyManagementException;
    import java.security.NoSuchAlgorithmException;
    
    /**
     * @Description 跳过证书配置类
     * @author xz
     */
    public class OKHttpClientBuilder {
        public static OkHttpClient.Builder buildOKHttpClient() {
            try {
                TrustManager[] trustAllCerts = buildTrustManagers();
                final SSLContext sslContext = SSLContext.getInstance("SSL");
                sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
    
                final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
                OkHttpClient.Builder builder = new OkHttpClient.Builder();
                builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
                builder.hostnameVerifier((hostname, session) -> true);
                return builder;
            } catch (NoSuchAlgorithmException | KeyManagementException e) {
                e.printStackTrace();
                return new OkHttpClient.Builder();
            }
        }
    
        private static TrustManager[] buildTrustManagers() {
            return new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                        }
    
                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                        }
    
                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };
        }
    }

2.2、okhttp方式的 https工具类

  • okhttp方式的 https工具类代码

    java 复制代码
    package com.xz.https;
    
    import lombok.extern.slf4j.Slf4j;
    import okhttp3.*;
    
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @Description okhttp方式的 https工具类
     * @author xz
     */
    @Slf4j
    public class OkhttpsUtils {
    
        /**
         * 获取客户端链接
         */
        private static OkHttpClient getClient() {
            OkHttpClient okHttpClient = OKHttpClientBuilder.buildOKHttpClient().
                    connectTimeout(5000, TimeUnit.SECONDS).
                    readTimeout(20000, TimeUnit.SECONDS).
                    writeTimeout(20000, TimeUnit.SECONDS).
                    build();
            return okHttpClient;
        }
    
    
    
        private static Request getRequest(String url, Map<String,String> header) throws MalformedURLException {
            Request.Builder builder = getBuilder(header);
            URL uri = new URL(url);
            return builder.url(uri).build();
        }
    
        private static Request.Builder getBuilder(Map<String,String> header) {
            Request.Builder builder = new Request.Builder();
    
            builder.addHeader("accept", "application/json").
                    addHeader("connection", "Keep-Alive").
                    addHeader("Content-Type", "application/json;charset=UTF-8");
            if(header != null && header.entrySet().size()>0){
                for(Map.Entry<String,String>  entry:header.entrySet()){
                    builder.addHeader(entry.getKey(),entry.getValue());
                }
            }
            return builder;
        }
    
        /**
         * doGet请求
         */
        public static String doGet(String url, String param, Map<String,String> header) {
            if (param != null) {
                url = url + "?" + param;
            }
    
            String result = null;
            try {
                OkHttpClient okHttpClient = getClient();
                Request request = getRequest(url,header);
                Response response = okHttpClient.newCall(request).execute();
                if (response.isSuccessful()) {
                    ResponseBody body = response.body();
                    if (body != null) {
                        result = body.string();
                    } else {
                        throw new IOException("response body is null");
                    }
                } else {
                    response.close();
                }
            } catch (IOException e) {
                log.error("GET请求异常,url = {}", url, e);
            }
            return result;
        }
    
        /**
         * doPost请求
         */
        public static String doPost(String url, String param,Map<String,String> header) {
    
            OkHttpClient okHttpClient = getClient();
            Request.Builder builder = getBuilder(header);
            String result = null;
            try {
                RequestBody requestBody = RequestBody.create(param.getBytes("UTF-8"),
                        MediaType.parse(org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE));
                builder.post(requestBody);
                Request request = builder.url(url).build();
                Response response = okHttpClient.newCall(request).execute();
                if (response.isSuccessful()) {
                    ResponseBody body = response.body();
                    if (body != null) {
                        result = body.string();
                    } else {
                        throw new IOException("response body is null");
                    }
                } else {
                    response.close();
                }
            } catch (Exception e) {
                log.error("POST请求异常,url = {}", url, e);
            }
            return result;
        }
    
        /**
         * doDelete请求
         */
        public static String doDelete(String url, String param,Map<String,String> header) {
    
            OkHttpClient okHttpClient = getClient();
            Request.Builder builder = getBuilder(header);
            String result = null;
            try {
                if (param != null) {
                    RequestBody requestBody = RequestBody.create(param.getBytes("UTF-8"),
                            MediaType.parse(org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE));
                    builder.delete(requestBody);
                } else {
                    builder.delete();
                }
                Request request = builder.url(url).build();
                Response response = okHttpClient.newCall(request).execute();
                if (response.isSuccessful()) {
                    ResponseBody body = response.body();
                    if (body != null) {
                        result = body.string();
                    } else {
                        throw new IOException("response body is null");
                    }
                } else {
                    response.close();
                }
            } catch (Exception e) {
                log.error("DELETE请求异常,url = {}", url, e);
            }
            return result;
        }
    
        /**
         * doPut请求
         */
        public static String doPut(String url, String param,Map<String,String> header) {
            OkHttpClient okHttpClient = getClient();
            Request.Builder builder = getBuilder(header);
            String result = null;
            try {
                RequestBody requestBody = RequestBody.create(param.getBytes("UTF-8"),
                        MediaType.parse(org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE));
                builder.put(requestBody);
                Request request = builder.url(url).build();
                Response response = okHttpClient.newCall(request).execute();
    
                if (response.isSuccessful()) {
                    ResponseBody body = response.body();
                    if (body != null) {
                        result = body.string();
                    } else {
                        throw new IOException("response body is null");
                    }
                } else {
                    response.close();
                }
            } catch (Exception e) {
                log.error("PUT请求异常,url = {}", url, e);
            }
            return result;
        }
    
    }

三、测试类

  • 测试代码

    java 复制代码
    package com.xz.https;
    
    import com.alibaba.fastjson.JSONObject;
    
    /**
     * @author: xz
     * @since: 2024/1/11 22:07
     * @description:
     */
    public class HttpsUtilsTest {
        public static void main(String[] args) throws Exception {
            String url="https://xxx.com.cn:5678/gateway/user/service/getxxxx";
            UserReq userReq = new UserReq ();
            userReq .setName("张三");
            String result = OkhttpsUtils.doPost(url, JSONObject.toJSONString(accessTokenReq), null);
            System.out.println("Okhttps---https请求:"+result);
        }
    }
  • 测试输出结果

相关推荐
JosieBook4 分钟前
【数据库】时序预测能力的分级进化:TimechoAI如何让每一类用户都能精准预见未来
java·开发语言·数据库
一生了无挂1 小时前
Java处理JSON技巧教学(从基础到高阶实战全覆盖)
java·开发语言·json
李白的天不白1 小时前
使用 SmartAdmin 进行前后端开发
java·前端
swordbob1 小时前
Spring 单例 Bean 是线程安全的吗?
java·开发语言
2601_951643772 小时前
Python第一,Java跌出前三,C语言杀回来了
java·c语言·python·编程语言排行·技术趋势
IT 行者4 小时前
GitHub Spec Kit 实战(五):/speckit.tasks 怎么拆——Spec Kit 五部曲收官
java·ai编程·claude
(Charon)4 小时前
【C++ 面试高频基础:指针、引用、const、static、new/delete 总结】
java·开发语言
Yeats_Liao5 小时前
Feed流系统设计(三):数据模型与存储设计,从表结构到Redis收件箱
java·javascript·redis
JiaHao汤5 小时前
分布式事务方案全景:从理论到 Seata 落地
java·分布式·spring·spring cloud
色空大师6 小时前
【debug调试详解-idea】
java·ide·intellij-idea·调试·远程调试