有了 websocket 还需要普通 http 连接么?

思否 问答 👍 3 含 AI 优化版

问题

有了 websocket 还需要普通 http 连接么?

在 SegmentFault 查看原问题 →

由大模型辅助整理,保留原意,优化结构与可读性。

问题概述

如果项目里已经使用了 WebSocket,是否还需要保留普通的 HTTP 请求?可以完全用 WebSocket 替代 HTTP 吗?

涉及技术

WebSocket、HTTP、请求生命周期管理(超时、取消、鉴权)

期望结果

了解全面转向 WebSocket 需要额外自己实现哪些能力,从而判断是否值得替代 HTTP。

回答

原始回答

可以完全基于 websocket。但是abort 需要你自己实现了,success 和 error 也需要你自己实现的了。timeout 也需要你自己实现了等等很多东西都无了。昂,对了,鉴权也是一个其他的方式。已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

AI 优化 · 回答整理

解答思路

技术上完全可以只用 WebSocket 来传递数据,不再依赖普通 HTTP 请求;但 HTTP 生态(fetch/XMLHttpRequest)已经内置了大量“开箱即用”的能力,如果全部换成 WebSocket,这些能力都需要自己在应用层重新实现一遍。

详细说明

从 HTTP 切换到纯 WebSocket 需要自行补齐的能力包括:

  • 请求取消(abort):HTTP 有 AbortController 原生支持,WebSocket 上没有对应“取消某一次请求”的语义,需要自己设计一套「请求 ID + 取消通知」协议。
  • 成功/失败回调(success/error):HTTP 请求天然有状态码、Promise resolve/reject;WebSocket 是长连接、多路复用的消息通道,需要自己给每条消息编号、约定响应结构,才能对应到具体某次“请求”的成功或失败。
  • 超时(timeout):HTTP 客户端库通常内置超时机制;WebSocket 需要自己起定时器,在约定时间内没有收到对应响应就判定超时。
  • 鉴权方式不同:HTTP 可以方便地在每次请求的 Header 里带 token;WebSocket 通常只能在建立连接时传一次鉴权信息,之后的鉴权状态维护、断线重连后的重新鉴权都需要额外设计。

小结

纯技术上 WebSocket 可以取代 HTTP,但 HTTP 及其客户端生态已经帮你实现了取消、超时、状态码等一整套请求生命周期管理,全面切换到 WebSocket 意味着这些能力都要自己重新造轮子,需要综合评估投入产出比。

由大模型辅助整理,保留原意,补充结构与代码格式。

回答转载自 SegmentFault

评论

评论功能即将开放。你也可以通过 邮件GitHub Issue 反馈。