之前我在Java Web项目中,网络请求用的是http>okhttp
,今天发现很多网络请求都不通,通过日志发现,发现使用okhhtp
出现了错误。
请求失败:CLEARTEXT communication not enabled for client
<dependency>
<groupId>com.squareup.http>okhttp3</groupId>
<artifactId>http>okhttp</artifactId>
<version>3.10.0</version>
</dependency>
然后我在网上查询问题,网上给出的回答是:
这个问题通常是由于网络请求使用了非加密的明文传输而引起的。默认情况下,Android 9.0(API级别28)之后的版本禁止应用程序使用明文HTTP进行网络通信,以提高数据的安全性。如果应用程序尝试使用不安全的明文通信,就会出现"CLEARTEXT communication not enabled for client"的错误。
为了解决这个问题,你可以通过以下几种方法之一来启用明文通信:
- 升级到使用加密的HTTPS通信,这是推荐的方法。你可以使用自签名证书或从有效的证书颁发机构(CA)获取的证书来配置HTTPS。
- 在应用程序的AndroidManifest.xml文件中添加以下代码来启用明文通信:
<application
…
android:usesCleartextTraffic=“true”
…>
…
</application>
但是我是Java WEB的项目,不是Android项目,不能用这种方式。
后面创建okHttpClient
对象时修改了一下配置就解决问题了
if (okHttpClient == null) {
synchronized (OkHttpUtils.class) {
if (okHttpClient == null) {
TrustManager[] trustManagers = buildTrustManagers();
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.MINUTES)
.writeTimeout(20, TimeUnit.MINUTES)
.readTimeout(20, TimeUnit.MINUTES)
.protocols(Arrays.asList(Protocol.HTTP_1_1,Protocol.HTTP_2))
.sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
.hostnameVerifier((hostName, session) -> true)
.retryOnConnectionFailure(true)
//加入了本段代码,即可解决问题
.connectionSpecs(Arrays.asList(
ConnectionSpec.MODERN_TLS,
ConnectionSpec.COMPATIBLE_TLS,
ConnectionSpec.CLEARTEXT))
.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");
}
}
}
}
我新加了这段配置
.connectionSpecs(Arrays.asList(
ConnectionSpec.MODERN_TLS,
ConnectionSpec.COMPATIBLE_TLS,
ConnectionSpec.CLEARTEXT))
目前能顺利调用HTTP协议的接口了。