锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

SpringBoot 配置 okhttp3

时间:2022-09-15 06:30:00 kmf磁感应直线位移传感器sunx电涡流位移传感器

1.Maven添加依赖

     com.squareup.okhttp3     okhttp     3.10.0 

2. application.properties配置文件

 ok.http.connect-timeout=30 ok.http.read-timeout=30 ok.http.write-timeout=30 # 连接池中整个空闲连接的最大数量 ok.http.max-idle-connections=200 # 连接空闲时间最多 300 秒 ok.http.keep-alive-duration=300

3. OkHttpConfiguration 配置类

import okhttp3.ConnectionPool; import okhttp3.OkHttpClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;   import javax.net.ssl.*; import java.security.*; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.concurrent.TimeUnit;     /**  * @author Answer.AI.L  * @date 2019-04-09  */ @Configuration public class OkHttpConfiguration {       @Value("${ok.http.connect-timeout}")     private Integer connectTimeout;       @Value("${ok.http.read-timeout}")     private Integer readTimeout;       @Value("${ok.http.write-timeout}")     private Integer writeTimeout;       @Value("${ok.http.max-idle-connections}")     private Integer maxIdleConnections;       @Value("${ok.http.keep-alive-duration}")     private Long keepAliveDuration;       @Bean     public OkHttpClient okHttpClient() {         return new OkHttpClient.Builder()                 .sslSocketFactory(sslSocketFactory(), x509TrustManager())                 // 缓存是否打开                 .retryOnConnectionFailure(false)                 .connectionPool(pool())                 .connectTimeout(connectTimeout, TimeUnit.SECONDS)                 .readTimeout(readTimeout, TimeUnit.SECONDS)                 .writeTimeout(writeTimeout,TimeUnit.SECONDS)              .hostnameVerifier((hostname, session) -> true)              // 设置代理 //             .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8888)))                 // 拦截器 //                .addInterceptor()                 .build();     }       @Bean     public X509TrustManager x509TrustManager() {         return new X509TrustManager() {             @Override             public void checkClientTrusted(X509Certificate[] chain, String authType)                     throws CertificateException {             }             @Override             public void checkServerTrusted(X509Certificate[] chain, String authType)                     throws CertificateException {             }             @Override             public X509Certificate[] getAcceptedIssuers() {                 return new X509Certificate[0];             }         };     }       @Bean     public SSLSocketFactory sslSocketFactory() {         try {             // 信任任何链接             SSLContext sslContext = SSLContext.getInstance("TLS");             sslContext.init(null, new TrustManager[]{x509TrustManager()}, new SecureRandom());             return sslContext.getSocketFactory();         } catch (NoSuchAlgorithmException | KeyManagementException e) {             e.printStackTrace();         }         return null;     }       @Bean     public ConnectionPool pool() {         return new ConnectionPool(maxIdleConnections, keepAliveDuration, TimeUnit.SECONDS);     } }

4.OkHttp类

import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;   import java.util.Map;     /**  * @author Answer.AI.L  * @date 2019-04-09  */ @Slf4j @Component public class OkHttpCli {     private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");     private static final MediaType XML = MediaType.parse("application/xml; charset=utf-8");       @Autowired     private OkHttpClient okHttpClient;       /**      * get 请求      * @param url       请求url地址      * @return string      * */     public String doGet(String url) {         return doGet(url, null, null);     }         /**      * get 请求      * @param url       请求url地址      * @param params    请求参数 map      * @return string      * */     public String doGet(String url, Map params) {         return doGet(url, params, null);     }       /**      * get 请求      * @param url       请求url地址      * @param headers   请求头字段 {k1, v1 k2, v2, ...}      * @return string      * */     public String doGet(String url, String[] headers) {         return doGet(url, null, headers);     }         /**      * get 请求      * @param url       请求url地址      * @param params    求参数 map
     * @param headers   请求头字段 {k1, v1 k2, v2, ...}
     * @return string
     * */
    public String doGet(String url, Map params, String[] headers) {
        StringBuilder sb = new StringBuilder(url);
        if (params != null && params.keySet().size() > 0) {
            boolean firstFlag = true;
            for (String key : params.keySet()) {
                if (firstFlag) {
                    sb.append("?").append(key).append("=").append(params.get(key));
                    firstFlag = false;
                } else {
                    sb.append("&").append(key).append("=").append(params.get(key));
                }
            }
        }
 
        Request.Builder builder = new Request.Builder();
        if (headers != null && headers.length > 0) {
            if (headers.length % 2 == 0) {
                for (int i = 0; i < headers.length; i = i + 2) {
                    builder.addHeader(headers[i], headers[i + 1]);
                }
            } else {
                log.warn("headers's length[{}] is error.", headers.length);
            }
 
        }
 
        Request request = builder.url(sb.toString()).build();
        log.info("do get request and url[{}]", sb.toString());
        return execute(request);
    }
 
    /**
     * post 请求
     * @param url       请求url地址
     * @param params    请求参数 map
     * @return string
     */
    public String doPost(String url, Map params) {
        FormBody.Builder builder = new FormBody.Builder();
 
        if (params != null && params.keySet().size() > 0) {
            for (String key : params.keySet()) {
                builder.add(key, params.get(key));
            }
        }
        Request request = new Request.Builder().url(url).post(builder.build()).build();
        log.info("do post request and url[{}]", url);
 
        return execute(request);
    }
 
 
    /**
     * post 请求, 请求数据为 json 的字符串
     * @param url       请求url地址
     * @param json      请求数据, json 字符串
     * @return string
     */
    public String doPostJson(String url, String json) {
        log.info("do post request and url[{}]", url);
        return exectePost(url, json, JSON);
    }
 
    /**
     * post 请求, 请求数据为 xml 的字符串
     * @param url       请求url地址
     * @param xml       请求数据, xml 字符串
     * @return string
     */
    public String doPostXml(String url, String xml) {
        log.info("do post request and url[{}]", url);
        return exectePost(url, xml, XML);
    }
 
 
    private String exectePost(String url, String data, MediaType contentType) {
        RequestBody requestBody = RequestBody.create(contentType, data);
        Request request = new Request.Builder().url(url).post(requestBody).build();
 
        return execute(request);
    }
 
    private String execute(Request request) {
        Response response = null;
        try {
            response = okHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                return response.body().string();
            }
        } catch (Exception e) {
            log.error(ExceptionUtils.getStackTrace(e));
        } finally {
            if (response != null) {
                response.close();
            }
        }
        return "";
    }
 
}

 5. 使用验证

@RestController
public class AnswerController {
    @Autowired
    private OkHttpCli okHttpCli;
    
    
	@RequestMapping(value = "show", method = RequestMethod.GET)
    public String show() {
        String url = "https://www.baidu.com/";
		String message = okHttpCli.doGet(url);
        return message;
    }
    
}

 6. 双向认证(待证)

@Bean
public SSLSocketFactory sslSocketFactory() {
    String certPath = "";
    String caPath = "";
    String certPwd = "";
    String caPwd = "";
 
    try {
        ClassPathResource selfcertPath = new ClassPathResource(certPath);
        ClassPathResource trustcaPath = new ClassPathResource(caPath);
        KeyStore selfCert = KeyStore.getInstance("pkcs12");
        selfCert.load(selfcertPath.getInputStream(), certPwd.toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");
        kmf.init(selfCert, certPwd.toCharArray());
        KeyStore caCert = KeyStore.getInstance("jks");
        caCert.load(trustcaPath.getInputStream(), caPwd.toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");
        tmf.init(caCert);
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
        return sslContext.getSocketFactory();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

Okhttp3 是一个高性能网络请求框架,支持支持HTTPS/HTTP2/WebSocket ,其核心有一下几点:

  1. 采用责任链方式的拦截器,实现分层处理网络请求,让用户对网络请求实现了更好的扩展

  2. GZIP处理降低了下载数据的大小

  3. 支持http 缓存

  4. 采用线程池(thread pool)和连接池(socket pool)解决多并发问题,同时连接池采支持多路复用(http2才支持多路复用,单路复用指的是,一个socket 只有把一个请求发送完成后,才能继续发送第二个请求,多路复用可以让一个socket 同时发送多个请求的数据,内部会自动维护顺序),减少连接创建开销

  5. 底层采用 socket 和服务器进行连接。

  6. 采用okio 实现高效的io流读写

Okhttp3 支持同步和异步两种方式请求:

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章