快进到 2017 年 12 月,(实际上)每个浏览器都支持 Websocket,并且它们的使用非常普遍。
然而,这并不意味着 Websockets 成功地取代了 AJAX,至少不是完全取代,尤其是在 HTTP/2 适配正在兴起的情况下。
简短的回答是 AJAX 仍然适用于大多数 REST 应用程序,即使在使用 Websockets 时也是如此。但上帝在细节中,所以......:
AJAX 用于轮询?
使用 AJAX 进行轮询(或长轮询)正在消亡(而且应该如此),但出于两个充分的原因(主要用于较小的 Web 应用程序),它仍然在使用:
对于许多开发人员来说,AJAX 更容易编码,尤其是在编码和设计后端时。
使用 HTTP/2,与 AJAX(建立新连接)相关的最高成本被消除,从而使 AJAX 调用具有相当高的性能,尤其是在发布和上传数据时。
但是,Websocket 推送远优于 AJAX(无需重新验证或重新发送标头,无需“无数据”往返等)。这被讨论了很多次。
用于 REST 的 AJAX?
AJAX 的更好用途是 REST API 调用。这种使用简化了代码库并防止 Websocket 连接阻塞(尤其是在中等大小的数据上传时)。
有许多令人信服的理由更喜欢 AJAX 进行 REST API 调用和数据上传:
AJAX API 实际上是为 REST API 调用而设计的,非常适合。
使用 AJAX 的 REST 调用和上传在客户端和后端都更容易编写代码。
随着数据负载的增加,Websocket 连接可能会被阻塞,除非对消息分段/多路复用逻辑进行编码。
如果在单个 Websocketsend
调用中执行上传,它可能会阻塞 Websocket 流,直到上传完成。这会降低性能,尤其是在速度较慢的客户端上。
一种常见的设计使用通过 Websocket 传输的小型双向消息,而 REST 和数据上传(客户端到服务器)利用 AJAX 的易用性来防止 Websocket 阻塞。
但是,在较大的项目中,Websockets 提供的灵活性以及代码复杂性和资源管理之间的平衡将使平衡倾向于 Websockets。
例如,基于 Websocket 的上传可以提供在连接断开并重新建立后恢复大型上传的能力(还记得您要上传的 5GB 电影吗?)。
通过编码上传碎片逻辑,很容易恢复中断的上传(困难的部分是编码)。
HTTP/2 推送呢?
我可能应该补充一点,HTTP/2 推送功能不会(也可能不能)取代 Websockets。
这已经在这里讨论过,但只要提到单个 HTTP/2 连接服务于整个浏览器(所有选项卡/窗口)就足够了,因此 HTTP/2 推送的数据不知道它属于哪个选项卡/窗口,消除了替代 Websocket 将数据直接推送到特定浏览器选项卡/窗口的能力。
虽然 Websockets 非常适合小型双向数据通信,但 AJAX 仍然具有许多优势 - 特别是在考虑更大的有效负载(上传等)时。
和安全?
好吧,一般来说,为程序员提供的信任和控制越多,工具就越强大......并且会出现更多的安全问题。
AJAX 本质上会占上风,因为它的安全性内置在浏览器的代码中(这有时是有问题的,但它仍然存在)。
另一方面,AJAX 调用更容易受到“中间人”攻击,而 Websockets 安全问题通常是应用程序代码中引入安全漏洞的错误(通常后端身份验证逻辑是您可以找到这些漏洞的地方)。
就我个人而言,我认为这并没有那么大的区别,如果有什么我认为 Websockets 稍微好一点的话,尤其是当你知道你在做什么的时候。
我的拙见
恕我直言,除了 REST API 调用,我会使用 Websockets。大数据上传我会尽可能分段并通过 Websockets 发送。
恕我直言,轮询应该被取缔,网络流量的成本是可怕的,而且即使对于新开发人员来说,Websocket 推送也很容易管理。