基于okhttp3封装的http请求工具类

package com.sx.common.utils.http;

import com.alibaba.fastjson.JSON;
import com.sx.common.utils.FileUtils;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;


/**
 * @author Dj
 * @Description: 基于okhttp3封装的http请求工具类, 下方有各种请求示例
 * @date 2020年04月25日
 */
public class OkHttpUtil {
   
    Logger logger = LoggerFactory.getLogger(OkHttpUtil.class);
    // http 对象
    private static volatile OkHttpClient okHttpClient = null;
    // 控制访问线程数量
    private static volatile Semaphore semaphore = null;
    // 请求头map
    private Map<String, String> headerMap;
    // 请求数据参数map
    private Map<String, String> paramMap;
    // 请求url
    private String url;
    private Request.Builder request;

    /**
     * 初始化okHttpClient,并且允许https访问
     */
    public OkHttpUtil() {
   
        if (okHttpClient == null) {
   
            synchronized (OkHttpUtil.class) {
   
                if (okHttpClient == null) {
   
                    TrustManager[] trustManagers = buildTrustManagers();
                    okHttpClient = new OkHttpClient.Builder()
                            .connectTimeout(180, TimeUnit.SECONDS)
                            .writeTimeout(180, TimeUnit.SECONDS)
                            .readTimeout(180, TimeUnit.SECONDS)
                            .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
                            .hostnameVerifier((hostName, session) -> true)
                            .retryOnConnectionFailure(true)
                            .build();
                    addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
                }
            }
        }
    }

    /**
     * 用于异步请求时,控制访问线程数,返回结果
     *
     * @return
     */
    private static Semaphore getSemaphoreInstance() {
   
        //只能1个线程同时访问
        synchronized (OkHttpUtil.class) {
   
            if (semaphore == null) {
   
                semaphore = new Semaphore(0);
            }
        }
        return semaphore;
    }

    /**
     * 创建OkHttpUtils 对象
     *
     * @return
     */
    public static OkHttpUtil builder() {
   
        return new OkHttpUtil();
    }

    /**
     * 添加url
     *
     * @param url
     * @return
     */
    public OkHttpUtil url(String url) {
   
        this.url = url;
        return this;
    }

    /**
     * 添加参数
     *
     * @param key   参数名
     * @param value 参数值
     * @return
     */
    public OkHttpUtil addParam(String key, String value) {
   
        if (paramMap == null) {
   
            paramMap = new LinkedHashMap<>(16);
        }
        paramMap.put(key, value);
        return this;
    }


    /**
     * 添加请求头
     *
     * @param key   参数名
     * @param value 参数值
     * @return
     */
    public OkHttpUtil addHeader(String key, String value) {
   
        if (headerMap == null) {
   
            headerMap = new LinkedHashMap<>(16);
        }
        headerMap.put(key, value);
        return this;
    }

    /**
     * 初始化get方法
     * 并转化paramMap数据格式为 url?Key1=xxx&Key2=xxx&Key3=xxx
     *
     * @return
     */
    public OkHttpUtil get() {
   
        request = new Request.Builder().get();
        StringBuilder urlBuilder = new StringBuilder(url);
        if (paramMap != null) {
   
            urlBuilder.append("?");
            try {
   
                for (Map.Entry<String, String
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值