不是一个链接当多个用,而是支持多种类型的数据。
同一个服务器,既可以返回 JSON 数据、又可以返回图片数据、还可以返回 HTML/CSS/JS 等文本数据、甚至还可以返回视频数据。同一个浏览器,既可以给后端提交表单、又可以给后端提交 JSON。这些数据类型,前后端怎么区分它们呢?
在 HTTP 请求和响应标头里,有 Accept
、Accpet-Encoding
、Accept-Language
、Content-Type
、Content-Encoding
、Content-Language
、Content-Length
、Content-Range
等等等等一系列的值,可以描述在浏览器和服务器之间传递的数据是啥。
比如浏览器给服务器发送一个 Content-Type: application/json
,那服务器就知道了这是个 JSON 数据,就要按 JSON 的格式去解析;服务器给浏览器返回了一个 Content-Type: image/jpeg
,浏览器就知道这是一个图片数据,就要按图片的格式去解析。
所以在 WebSocket 里,也有这么一个值可以表示传输的数据类型是啥,就是这个子协议了。其本质也是一个请求或响应标头。
不过上面说的两种 HTTP 的数据类型,都是 MIME,有个 RFC-6838 来规范它们。但 WebSocket 里就没有这种规范了,你得自己去定义。
这个值无论在 HTTP 中也好、在 WebSocket 中也罢,都是前后端之间的“约定”,得两端都得遵守才行。浏览器发给服务器的标明了自己是 application/json
,但服务器压根不管,偏要按照 application/x-www-form-urlencoded
去解析,那就没办法了。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…