解决okhttp无法调用HTTP协议的接口问题

之前我在Java Web项目中,网络请求用的是okhttp,今天发现很多网络请求都不通,通过日志发现,发现使用okhhtp出现了错误。

复制代码
请求失败:CLEARTEXT communication not enabled for client

我的okhttp版本为

复制代码
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>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对象时修改了一下配置就解决问题了

java 复制代码
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协议的接口了。

相关推荐
青衫客3637 分钟前
从网卡到 Socket:再探 Linux 网络协议栈与 iptables 数据包处理流程
linux·网络·网络协议
牧瀬クリスだ1 小时前
Ajax入门:从原生XHR到axios实战
java·spring boot·ajax·okhttp
zxanz11 小时前
SSL 证书申请中,服务器验证跟 DNS 解析验证有什么区别?
服务器·网络协议·ssl
TechWayfarer10 小时前
精度极限的突破:AI与IPv6如何重塑高精度IP查询
人工智能·网络协议·tcp/ip·transformer
墨神谕17 小时前
RPC框架与HTTP REST的区别
网络协议·http·rpc
Tech探索者17 小时前
没有公网 IP、不会端口映射?用 Natfrp 轻松远程访问家中 NAS
网络协议·tcp/ip·智能路由器
HY小宝F17 小时前
树莓派智能摄像头系统 30 天重学计划之 Day 04 · HTTP / API:控制链入口 —— 学习总结
网络协议·学习·http
蜗牛互联网18 小时前
Java标准HTTP调用多模态模型的票据抽取前置校验
java·人工智能·python·http
福大大架构师每日一题21 小时前
mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升
网络协议·udp·webrtc
曹小强wxx1 天前
Flutter 局域网设备发现:UDP 广播 + mDNS 双路合并,以及靠谱的在线判定与断线重连
物联网·网络协议·flutter