webSocket;fetch;FormData类型;XMLHttpRequest对象;

疑问:

  • webSocket是轮询的代替方案?
    • 都全双工双向通信了,还轮询个锤子。
  • 为什么不都使用webSocket算了

    • 需要专有服务器,建立通信的成本较高,要先发送请求初始化连接,适宜需要长时间通信的接口。
    • 服务端也要同步修改。

      书摘&心得:

  • 内容都由框架封装,实际接触的可能性很小,且内容大多偏工具

  • 想学习HTTP网络相关知识,不如直接看《图解HTTP》

    FormData类型

  • XHR对象:XMLHttpRequest对象

  • FormData类型便于表单序列化,也便于创建与表单类似格式的数据然后通过XHR发送。
  • 示例:image.png

    fetch

  • 是基于promise的

    • 所以说fetch/promise代替了ajax:传统ajax就是指XMLHttpRequest,而fetch是基于promise的
  • Fetch API本身是使用JavaScript请求资源的优秀工具,同时这个API也能够应用在服务线程(service worker)中,提供拦截、重定向和修改通过fetch()生成的请求接口。
  • fetch()方法是暴露在全局作用域中的,包括主页面执行线程、模块和工作线程。
    • 所以可以随便用
  • 请求完成、资源可用时,期约会解决为一个Response对象。

    示例

    1、发送JSON数据
    image.png
    2、在请求体中发送参数
    image.png
    3、发送文件
    image.png
    4、加载Blob文件
    image.png
    5、中断请求
    image.png
    6、直接传入Request对象
    注意不能传入已使用过的Request对象
    image.png

    webSocket

  • 通过一个长时连接实现与服务器全双工、双向的通信。

    1. let socket = new WebSocket('ws://www.example.com');
  • 工作原理

    • 在JavaScript中创建Web Socket时,一个HTTP请求会发送到服务器以初始化连接。
    • 服务器响应后,连接使用HTTP的Upgrade头部从HTTP协议切换到WebSocket协议。
    • 这意味着Web Socket不能通过标准HTTP服务器实现,而必须使用支持该协议的专有服务器。
  • 使用了自定义协议:不能再使用http://或https://,而要使用ws://和wss://。
    • ws://开头,很眼熟是不是,这是在docker+browserless环境中用puppeteer发起请求的链接头部!
    • 优点:客户端与服务器之间可以发送非常少的数据
    • 缺点:定义协议的时间比定义JavaScript API要长
  • 同源策略不适用于WebSocket,因此可以打开到任意站点的连接。
  • WebSocket有一个readyState属性表示当前状态。
    • ❑ WebSocket.OPENING(0):连接正在建立。
    • ❑ WebSocket.OPEN(1):连接已经建立。
    • ❑ WebSocket.CLOSING(2):连接正在关闭。
    • ❑ WebSocket.CLOSE(3):连接已经关闭。
  • 任何时候都可以调用socket.close关闭连接
    • readyState会立刻变成2,关闭后变为3
  • 发送/接收数据

    • socket.send:发送数据,可发送字符串、ArrayBuffer或Blob
    • socket.onmessage:接收数据
      1. let socket = new WebSocket('ws://www.example.com');
      2. let stringData = "Hello World";
      3. // 发送
      4. socket.send(stringData);
      5. // 接收
      6. socket.onmessage = funciton(event) {
      7. let data = event.data;
      8. // code
      9. }
      10. // 关闭连接
      11. socket.close();
  • 其他事件

    • ❑ open:在连接成功建立时触发。
    • ❑ error:在发生错误时触发。连接无法存续。
    • ❑ close:在连接关闭时触发。
    • image.png