文章目录[隐藏]
1. Maven 添加依赖
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.10.0</version> </dependency>
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<String, String> 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<String, String> 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<String, String> 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.
本文来源gao!%daima.com搞$代*!码网1
使用验证
@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; }