# 简介

# REST

:表述性状态转移(Representational State Transfer),是一种与 HTTP 协议相似的 HTTP API 规范。

  • 主要规范:
    • 将每个资源用一个唯一的 URL 标识。
    • URL 应该是名词性的,且区分单复数。比如 /students/names 要优于 /students/getName 。
    • 主要使用 GET、POST、PUT、DELETE 四种 HTTP 方法,实现 CRUD 操作。
    • 报文 body 通常采用 JSON 格式。
    • 客户端与服务器之间采用无状态通信,所以客户端的每个请求都应该自带上下文信息。
  • 符合 REST 规范的 API 称为 RESTful API 。
    • 还有其它的 API 规范,比如模仿数据库的 CRUD 操作。
  • 优点:
    • 简单易懂,了解 HTTP 协议即可理解 REST 规范。
    • 服务器与客户端基本解耦。
  • 缺点:
    • 操作对象不一定是一个具体的资源,不一定适合用 URL 表示。
    • 只有少数几种 HTTP 方法,不能体现某些特别的操作,比如既需要读、又需要写的操作。

# RPC

:远程过程调用(Remote Procedure Call),是一种 API 规范,用于在本机代码中调用其它主机上的进程的方法。

  • 常用于分布式系统中,实现不同主机的进程之间的相互调用。
  • RPC 与 REST 的区别:
    • RESET 只是 HTTP API 规范,而 RPC 是更抽象的 API 规范,可以采用 TCP、UDP、HTTP 等通信协议。
    • 实现 RESTful API 只需要修改 HTTP 服务器的 API 行为 ,而实现 RPC 需要使用一个分布式框架。
  • gRPC :一个 RPC 框架,基于 HTTP/2 协议,由 Google 公司发布。

# GraphQL

:一种查询语言,方便通过 API 查询图状数据。

  • 2015 年,由 Facebook 公司发布。
  • 用于 HTTP API 时,可视作 REST 的替代方案。
  • 例:
    1. 客户端发出查询请求:
      {
        human(id: "2") {    # 查询指定 id 的 human 对象,要求返回指定字段的值
          name
          age
        }
      }
      
    2. 服务器返回响应:
      {
        "human": {
          "name": "Leo",
          "age": 20
        }
      }
      

# WebSocket

:HTML5 标准定义的一个协议。

# 原理

  • 属于应用层协议,基于 TCP 通信。
  • 通过 HTTP 协议握手,步骤如下:
    1. 客户端发出一个 GET 请求,采用 HTTP/1.1 协议,请求头包含 Upgrade: websocketConnection: Upgrade ,表示切换到 WebSocket 协议。
    2. 服务器返回一个响应报文,状态码为 101 (Switching Protocols) 。
    3. 双方通过该 HTTP 端口建立 TCP 长连接,进行全双工通信。
  • URL 分为两种格式:
    • ws :格式为 ws://host:port/path ,类似于 HTTP ,默认使用 TCP 80 端口。
    • wss :格式为 wss://host:port/path ,类似于 HTTPS ,默认使用 TCP 443 端口。

#

  • 客户端的 JS 代码示例:
    var ws = new WebSocket("ws://10.0.0.1/test");
    ws.send("Hello World!");
    ws.close();