以下是我问GPT得到的回答:
————————————GPT回答分割线————开始———————————————
当使用 OkHttpUtil 请求 HTTPS 网址时,遇到 "Failure in SSL library, usually a protocol error" 错误,可能是由于以下原因导致的:
- 证书问题:HTTPS 网址使用了自签名证书或无效证书,导致 SSL 验证失败。
解决方法:可以尝试忽略 SSL 验证,但这会带来安全风险,不推荐在正式环境中使用。可以使用 OkHttpClient
的 OkHttpClient.Builder
设置 TrustAllCerts
来实现忽略 SSL 验证,示例如下:
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(createTrustAllSocketFactory(), new TrustAllCerts());
OkHttpClient client = builder.build();
// 创建 OkHttpUtil 实例并使用自定义的 OkHttpClient
OkHttpUtil.init(client);
请注意,createTrustAllSocketFactory()
和 TrustAllCerts
是自定义的类,用于忽略 SSL 验证,请确保其正确实现。
- 协议版本问题:可能是服务器端与客户端之间的协议版本不兼容。
解决方法:尝试指定较低版本的协议进行连接。可以使用 OkHttpClient.Builder
的 protocols()
方法来设置支持的协议版本,示例如下:
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.protocols(Arrays.asList(Protocol.HTTP_1_1));
OkHttpClient client = builder.build();
// 创建 OkHttpUtil 实例并使用自定义的 OkHttpClient
OkHttpUtil.init(client);
在示例中,我们指定了仅支持 HTTP/1.1 协议。
- 服务器配置问题:可能是服务器端的 SSL 配置有问题,例如未正确配置证书或密码等。
解决方法:请与服务器管理员或开发人员联系,确保服务器端的 SSL 配置正确。
请注意,以上解决方法中的示例代码是基于 OkHttpUtil 的使用。如果你使用的是其他 HTTP 请求库或自己封装的网络请求工具,请根据具体的库和实现方式,进行相应的调整和处理。
————————————GPT回答分割线————结束———————————————
而我在实际中遇到这个问题的时候,经过询问后端同事得知他用的版本是:'com.squareup.okhttp3:okhttp:3.8.1' ,而我本端用的是'com.squareup.okhttp3:okhttp:3.3.1'的,当我把版本更新到与服务端一致时,问题得到解决。
以上为本人的开发中遇到的经历,仅作为记录,如果能给你带来帮助,那就更好了。
如果上述的办法也没有帮到你,可以看看这篇文章能不能对你有用:
/**
* OkHttp在4.4及以下不支持TLS协议的解决方法
*/
https://www.jianshu.com/p/98deba472702