愿历尽千帆,归来仍是少年
原因:避免频繁频繁的开关连接。
1.Maven添加依赖
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.10.0</version> </dependency>
2.OkHttpConfiguration 配置类
import okhttp3.ConnectionPool; import okhttp3.OkHttpClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.concurrent.TimeUnit; @Configuration public class OkHttpConfiguration { @Bean public OkHttpClient okHttpClient() { return new OkHttpClient.Builder() .sslSocketFactory(sslSocketFactory(), x509TrustManager()) // 是否开启缓存 .retryOnConnectionFailure(false) .connectionPool(pool()) .connectTimeout(10L, TimeUnit.SECONDS) .readTimeout(10L, TimeUnit.SECONDS) .writeTimeout(10L,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(20, 5L, TimeUnit.MINUTES); } }
maxIdleConnections
和 keepAliveDuration
是影响连接池行为的重要参数,你可以根据你的应用程序需求和服务器配置进行适当的设置。
-
maxIdleConnections
(最大空闲连接数):这个参数表示连接池中允许存在的最大空闲连接数。空闲连接是指当前没有正在使用的连接。如果连接池中的空闲连接数达到了这个最大值,那么新的连接将不再被创建,而是会被关闭。较大的空闲连接数可以提高连接的复用性和请求响应速度,但也会占用更多的系统资源。对于具体的值,可以根据你的应用程序负载和服务器负载进行评估和调整。 -
keepAliveDuration
(保持活动连接的时间):这个参数表示连接的最大空闲时间。如果一个连接在这段时间内处于空闲状态(没有被使用),它将被关闭并从连接池中移除。较长的 keep-alive 时间可以减少频繁创建和关闭连接的开销,并提高连接的复用性,但也会增加服务器端资源的占用。在设置这个值时,可以考虑服务器的 keep-alive 配置和网络延迟等因素。
下面是一些设置的建议:
-
对于
maxIdleConnections
,可以根据你的应用程序并发请求的数量,以及服务器的并发连接数限制来进行设置。一般来说,可以选择一个适中的数值,例如 5 到 10 之间,然后根据测试和实际情况进行调整。 -
对于
keepAliveDuration
,可以根据服务器的 keep-alive 配置和你希望保持连接活动的时间来进行设置。通常,可以根据服务器的 keep-alive timeout 值来进行设置,保持在服务器配置的 timeout 值以下。例如,如果服务器的 keep-alive timeout 是 60 秒,可以设置keepAliveDuration
为 45 到 50 秒左右,以确保连接不会过早关闭。
需要注意的是,这些值没有固定的标准,并且可能会因具体的应用程序和服务器配置而异。你可以先以合理的初始值开始,并通过测试和实际运行情况来进行调优和优化。
最后,建议根据实际的应用场景和需求,结合性能测试和监控数据进行设置和调整,以达到最佳的连接池性能和资源利用效率。
3.OKHttpUntil类
import com.wildyak.hutool.core.exceptions.ExceptionUtils; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Map; @Slf4j @Component public class OkHttpUtil { 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 param 请求参数 * @return string */ public String doPost(String url, String param) { okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder().url(url).post(body).build(); log.info("okhttp 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("okhttp request 出错啦:" + ExceptionUtils.getStackTrace(e)); } finally { if (response != null) { response.close(); } } return ""; } }
4.使用验证
@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; } }
标签:java,String,url,http,param,import,okhttp,return,public From: https://www.cnblogs.com/hxxgo520/p/17532079.html