东方财富sse接口无返回问题排查,OkHttp踩坑指南

东方财富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是最安全的。
  • 设置超时和开启请求日志能快速定位类似问题。