OkHttp是否遵循代理与非代理系统配置?
OkHttp对JVM代理系统属性的支持说明
首先明确:OkHttp 默认会读取并遵循JVM的代理系统属性(包括-Dhttps.proxyHost、-Dhttps.proxyPort、-Dhttps.nonProxyHosts),但有几个细节可能导致你遇到的问题:
一、nonProxyHosts不生效的常见原因
- 格式错误:
nonProxyHosts需用竖线|分隔主机名,支持通配符*,但不能包含空格。例如正确写法为*.internal.com|localhost,带空格的*.internal.com | localhost会导致匹配失败。 - 大小写不匹配:OkHttp的主机名匹配逻辑严格按字符串处理,建议
nonProxyHosts配置和请求的主机名大小写保持一致。 - IP与域名不对应:若请求使用IP地址而非域名,
nonProxyHosts里的域名配置无法匹配,需直接填写IP或带通配符的IP段(如192.168.*.*)。
二、java.net.ProtocolException: unexpected end of stream报错分析
这个错误通常和代理配置本身无关,是请求过程中连接异常中断导致的,常见场景:
- 代理服务器提前关闭连接:代理对非代理主机的请求处理逻辑异常,或代理本身有超时限制,导致连接提前断开。
- 请求/响应数据不完整:请求头或请求体的长度声明与实际发送内容不匹配,触发协议校验错误。
- SSL/TLS握手异常:绕过代理直接连接目标主机时,若目标主机的SSL证书配置不兼容(如证书过期、不被信任),会导致连接中断。
三、验证与调试建议
- 启用OkHttp日志:添加
HttpLoggingInterceptor打印完整请求流程,确认请求是否走代理、nonProxyHosts匹配是否生效。 - 环境验证:用
curl或wget携带相同JVM代理参数请求目标非代理主机,排查网络层面是否存在问题。 - 检查代码优先级:若依赖库手动设置了OkHttp的
Proxy对象,会覆盖系统属性配置,需确认库代码是否有硬编码代理逻辑。
内容的提问来源于stack exchange,提问作者Xendar
相关产品推荐
相关产品推荐

