一、请求--响应API。

请求--响应类的API的典型做法是,通过基于HTTP的Web服务器暴露一个/套接口。API定义一些端点,客户端发送数据的请求到这些端点,Web服务器处理这些请求,然后返回响应。响应的格式通常是JSON或XML。

在这种类型的Web API里,比较流行的是这三种:REST,RPC和GraphQL。

1.1 REST

REST全称是Representational State Transfer 表述性状态传递。REST可能是现在最流行的一种Web API。

REST的核心就是资源,一个资源就是可以被标识的实体,它有名称和地址。

REST API就是把数据以资源的形式暴露出来,并使用标准的HTTP方法来代表创建、读取、更新和删除资源等事务。

REST API有一些规则和约束,这里我就简单的写一下(之前的文章有详细描述):

  • 资源都是URL的一部分,例如/persons

  • 针对每个资源通常都会有两个URL被实现:“/persons”表示资源的集合,“/person/321”表示特定的一个资源

  • 在资源里,使用名词而不是动词,例如 /getUserInfo/123 这就不对了,应该是 /users/123

  • HTTP方法表明了要执行的动作,不同的HTTP方法作用于同一个URL上可实现不同的功能:

    • 创建 -- POST

    • 读取 -- GET

    • 整体更新 -- PUT

    • 局部更新 -- PATCH

    • 删除 -- DELETE

  • 服务器会返回标准的HTTP状态码,来表示请求成功或者失败,以及原因。通常2xx表示成功,3xx表示资源被移动了,4xx表示客户端引起的错误,5xx表示服务器端引起的错误。

如果两个资源有主从关系,那么子资源最好不采用顶级资源的URL,而是采用主资源的子资源URL地址。例如Province和City就是主从关系,那么City资源的URL应该是:/provinces/{provinceId}/cities,/provinces/{provinceId}/cities/{cityId}

非CRUD操作

API难免会有一个非CRUD的操作,例如“存档”这个操作。这时候我们可以采取以下几种办法:

  • 把这个动作作为资源的一个字段。例如把“存档”作为输入参数传递到API

  • 作为子资源。例如 /repos/{repoId}/issues/{issueId}/archive

  • 直接使用动词。实在不行了,就用动词吧,例如 /search/params?......

1.2 RPC

Remote Procedure Call。RPC是一种比较简单的API,客户端直接会执行另一个服务器上的代码。

REST是关于资源的,而RPC就是关于动作的。

在RPC里,客户端通常是把方法名和参数传递给服务器,然后服务器返回JSON或XML。

RPC的规则比较少:

  • 端点要包含被执行操作的名字

  • 使用合理的HTTP动词,GET用于读取,POST用于其它类型。

RPC适用于那种无法用CRUD封装的动作,或者其影响和资源无关的动作。

RPC不仅限于HTTP,还有其它协议可以支持,例如Apache Thrift和gRPC。

1.3 GraphQL

GraphQL 是 API的查询语言。最近越来越火。它由Facebook于2012年开始开发,2015年被开源了。

GraphQL允许客户端定义需要得到的数据结构,服务器精确的返回所需的数据结构,例如:

与REST和RPC不同,GraphQL API只需要一个端点;它也不需要使用不同的HTTP动词,它只使用POST,你需要在JSON body里面指定是要执行查询还是修改。

相对REST和RPC,GraphQL有下面几个优势:

  • 节省了多重的请求往返,GraphQL可以一次把所需的关联数据全部查询出来。不会存在例如N+1这样的问题

  • 避免了API版本问题。你可以随时添加字段和类型,不会影响现有的查询。可以标记弃用。通过Log可以追踪出哪些字段被谁使用,如果字段没人再去使用,就可以移除它了。

  • Payload比较小。REST和RPC的响应都包含客户端发送一些不需要的数据。而使用GraphQL的话,客户端得到的响应就是它所请求的那些东西,不多不少。

  • 强类型。GraphQL是强类型的,开发时有类型检查能保证查询的正确性和合理性。

  • 内省(Introspection)。像REST,就需要安装Swagger等工具来帮助浏览API。而GraphQL本身就具备可发现性。它还带有一个浏览器内的IDE用来浏览GraphQL API。下图就是Github的GraphQL API:

GraphQL的缺点就是它为服务器添加了许多复杂性,服务器需要额外的工作来处理这些复杂的查询。根据查询内容的不同,性能也是一个变数.

综上所述,那么什么时候应该用哪种Web API呢?

  • 针对CRUD类的API,使用REST

  • 针对暴露很多动作的API,使用RPC

  • 当你需要查询的灵活性以及维护的连续性时,使用GraphQL

二、事件驱动式 Web API

针对用请求-响应式API,如果服务的数据经常变化,那么响应就可能无法保持新鲜了。开发者如果想与变化的数据保持同步,就只能对API进行polling操作了。

但是如果poll的频率较低,客户端仍有可能无法获得从上次poll到现在所有的数据事件。如果poll的频率较高,还特别浪费资源。

所以我们需要实时的分享事件的数据,通常使用下面三种机制:WebHook,WebSocket,HTTP Streaming。

2.1 WebHooks

WebHook就是一个接收HTTP POST(或GET,PUT,DELETE)的URL。一个实现了WebHook的API提供商就是在当事件发生的时候会向这个配置好的URL发送一条信息。与请求-响应式不同,使用WebHook,你可以实时接受到变化。

下面是Polling和Webhook的比较:

WebHook非常适合于从一个服务器向另外一个服务器分享实时数据。

但是实现WebHook,也引入了新的复杂性:

  • 失败和重试。为了保证WebHook被成功的传输,你需要构建一个可以再发生错误时进行重试操作的系统。

  • 安全性。对于安全的调用REST API,现在的方案都比较成熟;而对于WebHook来说,这方面依然在探索中前进。

  • 防火墙。防火墙后运行的应用可以通过HTTP访问API,但是它们可能无法接收入站的流量。所以这是一个很大的问题。

  • 噪声。通常每个WebHook调用代表了一个事件,但当短时间内发生了成千上万个事件的时候,再通过WebHook来传输,就可能会有噪音。

2.2 WebSocket

WebSocket这个协议,它通过一个TCP协议建立一个双向全双工的流式通信。WebSocket通常用在客户端和服务器之间的通信,也可以用在服务器之间的通信。

ASP.NET Core SignalR就是优先使用该协议。

WebSocket支持全双工(服务器和客户端可以同时双向通信),而且开销不高。经常使用的端口式80或443,这样就很容易穿过防火墙了。

WebSocket特别适合于快速的,现场的路i数据和长连接。

如果连接挂掉了,客户端会尝试重新初始化连接。但是WebSocket有一些扩展性的问题,因为如果在线的客户端太多,那么服务器端就需要维持这些客户端打开的连接。

2.3 HTTP Streaming

使用请求-响应式API,客户端发送一个请求,服务器端返回一个响应,这个响应的长度是有限的。

而使用HTTP Streaming,服务器端可以在一个由客户端打开的长生存的连接里持续的推送新数据。

为了让数据通过一个可长时间存在的连接上进行传输,有两个方案:

  • 首先可以让服务器把Transfer-Encoding这个Header设为chunked。这表示客户端是按块接收数据的,块与块之间用换行符分割:“\r\n”。

  • 另一个选项是通过Server-Sent Events (SSE)来进行流数据。这个比较适合于浏览器内的客户端,因为这样它们就可以使用标准的EventSource API了。(SignalR在无法使用WebSocket的时候就会使用SSE)

HTTP Streaming用起来好像很容易,但是有个问题,是关于缓存的。客户端和代理经常会有缓存的限制。因为只有达到某个阈值之后,它们才会把数据渲染给应用。

综上,针对事件驱动式Web API:

  • 如果想要进行服务器间的实时事件通信,可以选择WebHooks

  • 如果需要浏览器和服务器间的双向实时通信,可以选择WebSocket

  • 如果需要使用简单的HTTP进行单向通信,可以使用HTTP Streaming

常见形式 Web API 的简单分类总结的更多相关文章

  1. ASP.NET Web API 的简单示例

    Demo1: HTML: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  2. Web APi之捕获请求原始内容的实现方法以及接受POST请求多个参数多种解决方案(十四)

    前言 我们知道在Web APi中捕获原始请求的内容是肯定是很容易的,但是这句话并不是完全正确,前面我们是不是讨论过,在Web APi中,如果对于字符串发出非Get请求我们则会出错,为何?因为Web A ...

  3. 简话ASP.NET Web API

    简话ASP.NET Web API 在vs2012中,我们很容易在根据选择的ASP.NET MVC Web应用程序来新建一个Web API应用,聪明的你一定想见得到,Web API和MVC有着某种联系 ...

  4. Asp.Net Web Api 与 Andriod 接口对接开发

    Asp.Net Web Api 与 Andriod 接口对接开发经验,给小伙伴分享一下!   最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用A ...

  5. Web Api 与 Andriod 接口对接开发经验

    最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用Asp.Net Web Api去跟 Andriod 那端做接口对接工作,自己也是第一次接触Web ...

  6. 新作《ASP.NET Web API 2框架揭秘》正式出版

    我觉得大部分人都是“眼球动物“,他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个“ ...

  7. Web APi之过滤器创建过程原理解析【一】(十)

    前言 Web API的简单流程就是从请求到执行到Action并最终作出响应,但是在这个过程有一把[筛子],那就是过滤器Filter,在从请求到Action这整个流程中使用Filter来进行相应的处理从 ...

  8. ASP.NET Web API 2框架揭秘

    ASP.NET Web API 2框架揭秘(.NET领域再现力作顶级专家精讲微软全新轻量级通信平台) 蒋金楠 著   ISBN 978-7-121-23536-8 2014年7月出版 定价:108.0 ...

  9. Asp.Net Web Api 与 Andriod 接口对接开发经验,给小伙伴分享一下!

    最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用Asp.Net Web Api去跟 Andriod 那端做接口对接工作,自己也是第一次接触Web ...

随机推荐

  1. GraphicsMagick+im4java实现高质量大图的处理

    http://www.open-open.com/lib/view/open1355754261963.html 做网站往往需要处理各种各样的图片,对于jdk自带的一套图片处理库,他的特点是稳定简单, ...

  2. Python实现Telnet自动连接检测密码

    最近在学习Python网络相关编程,这个代码实现了Telnet自动连接检测root用户密码,密码取自密码本,一个一个检测密码是否匹配,直到匹配成功,屏幕输出停止. Python内置了telnetlib ...

  3. linux下设置phantomjs环境变量

    1)vim /etc/profile2)在文件的最后一行,添加安装路径path语句:(注意路径是phantomjs的安装路径)export PATH=${PATH}:/usr/local/src/ph ...

  4. java中Collection容器

    1.容器(Collection)也称为集合, 在java中就是指对象的集合. 容器里存放的都只能是对象. 实际上是存放对象的指针(头部地址): 这里对于八种基本数据类型,在集合中实际存的是对应的包装类 ...

  5. 新浪微博注册(elenium Python 自动化)

    from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom time import sleep ...

  6. Python 可视化工具 Matplotlib

    英文出处:Chris Moffitt. Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表.本文主要介绍了在学习Matplotlib时 ...

  7. bzoj3594 方伯伯的玉米田 树状数组优化dp

    f[i][j]表示到第i位,使用了j次机会的最长不下降子序列长度 转移:f[i][j]=max(f[x][y])+1; x<i; y<=j; a[x]+y<=a[i]+j; 所以根据 ...

  8. java happens-before原则规则

    程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作: 锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作: volatile变量规则:对一个变量的写操 ...

  9. vue+axios访问本地json数据踩坑点

    当我们想在vue项目中模拟后台接口访问json数据时,我们发现无论如何也访问不到本地的json数据. 注意:1.在vue-cli项目中,我们静态资源只能放在static文件夹中,axios使用get请 ...

  10. Python中collections模块

    目录 Python中collections模块 Counter defaultdict OrderedDict namedtuple deque ChainMap Python中collections ...