# 相关概念
# REST
:表述性状态转移(Representational State Transfer),是一种基于 HTTP 协议设计的 API 规范。
- 用途:
- 客户端与服务器通过 HTTP 协议通信时,自由度较大,可能造成混乱。因此有些开发人员制定了 REST 规范,约束大家如何使用 HTTP 协议。
- 符合 REST 规范的 API 称为 RESTful API 。
- 主要规范:
- 调用 API 操作一个对象时,给该对象分配一个唯一的 URL 标识。
- URL 应该是名词性的,且区分单复数。比如 /students/names 要优于 /students/getName 。
- 主要使用 GET、POST、PUT、DELETE 四种 HTTP 方法,实现 CRUD 操作。
- 报文 body 通常采用 JSON 格式。
- 客户端与服务器之间采用无状态通信,所以客户端的每个请求都应该自带上下文信息。
- 优点:
- 简单易懂。
- 缺点:
- API 的操作对象可能不是一个具体的资源,不适合用 URL 表示。
- 只使用几种基础的 HTTP 方法,不能体现某些特殊操作,比如既需要读、又需要写的操作。
# RPC
:远程过程调用(Remote Procedure Call),是一种 API 规范,用于在本机代码中调用其它主机上的进程的方法。
- 常用于分布式系统中,实现不同主机的进程之间的相互调用。
- RPC 与 REST 的区别:
- REST 是基于 HTTP 协议的 API 规范,而 RPC 是更抽象的 API 规范,可采用 TCP、UDP、HTTP 等通信协议。
- 实现 RESTful API 只需要修改 HTTP 服务器的 API 行为 ,而实现 RPC 需要使用一个分布式框架。
- gRPC :一个 RPC 框架,基于 HTTP/2 协议,由 Google 公司发布。
# GraphQL
:一种查询语言,方便通过 API 查询图状数据。
- 2015 年,由 Facebook 公司发布。
- 用于 HTTP API 时,可视作 REST 的替代方案。
- 例:
- 客户端发出查询请求:
{ human(id: "2") { # 查询指定 id 的 human 对象,要求返回指定字段的值 name age } }
- 服务器返回响应:
{ "human": { "name": "Leo", "age": 20 } }
- 客户端发出查询请求:
# WebSocket
:HTML5 标准定义的一个协议。
# 原理
- 属于应用层协议,基于 TCP 通信。
- 通过 HTTP 协议握手,步骤如下:
- 客户端发出一个 GET 请求,采用 HTTP/1.1 协议,请求头包含
Upgrade: websocket
和Connection: Upgrade
,表示切换到 WebSocket 协议。 - 服务器返回一个响应报文,状态码为 101 (Switching Protocol) 。
- 双方通过该 HTTP 端口建立 TCP 长连接,进行全双工通信。
- 客户端发出一个 GET 请求,采用 HTTP/1.1 协议,请求头包含
- URL 分为两种格式:
- ws :格式为
ws://host:port/path
,类似于 HTTP ,默认使用 TCP 80 端口。 - wss :格式为
wss://host:port/path
,类似于 HTTPS ,默认使用 TCP 443 端口。
- ws :格式为
# 例
- 客户端的 JS 代码示例:
var ws = new WebSocket("ws://10.0.0.1/test"); ws.send("Hello World!"); ws.close();