东方财富sse接口无返回问题排查,OkHttp踩坑指南
背景
项目中需要调用第三方金融数据服务的 SSE(Server-Sent Events)接口,获取数据。原有代码使用 Java 原生的HttpURLConnection实现同步请求,能够正常读取数据。
后续需要将网络请求框架迁移至 OkHttp,但在使用 OkHttp 发起相同请求时,execute()方法会一直阻塞,始终收不到服务器的响应。而原HttpURLConnection代码即使存在部分请求头设置错误,依然能够正常工作。
OkHttp 请求阻塞问题总结
问题
从HttpURLConnection迁移到 OkHttp 后,请求同一个 SSE 接口时execute()一直阻塞,无法获得响应。
原因
Host 请求头与 URL 域名不一致。
- 请求 URL 是
https://89.push.example.com/... - 代码里手动设置了
Host: push.example.com(少了子域89)
服务器检测到 Host 不匹配,不返回任何响应,也不关闭连接,导致客户端一直等待。
为什么HttpURLConnection没出问题?
HttpURLConnection会忽略手动设置的 Host,强制使用 URL 中的域名。所以你“写错”了它也能正常工作。
OkHttp 则完全信任你设置的 Host,原样发送,因此错误直接暴露。
解决
删除手动设置 Host 的代码,让 OkHttp 自动生成即可。
// 删除这行,不要手动设置 Host// requestBuilder.header("Host", "...");核心教训
- 迁移代码时,不要照搬所有
setRequestProperty,尤其是Host。 - OkHttp 里让框架自动管理
Host是最安全的。 - 设置超时和开启请求日志能快速定位类似问题。