常见形式 Web API 的简单分类总结

一、请求--响应API

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

在这种类型的Web API里,比较流行的是这三种:RESTRPCGraphQL。 

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允许客户端定义需要得到的数据结构,服务器精确的返回所需的数据结构,例如:

640?wx_fmt=jpeg

 

 

与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:

 

640?wx_fmt=png

 

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

 

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

  • 针对CRUD类的API,使用REST

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

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

 

二、事件驱动式 Web API

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

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

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

2.1 WebHooks

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

 

下面是Polling和Webhook的比较:

640?wx_fmt=png

 

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有一些扩展性的问题,因为如果在线的客户端太多,那么服务器端就需要维持这些客户端打开的连接。

640?wx_fmt=png

 

2.3 HTTP Streaming

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

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

640?wx_fmt=png

 

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

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

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

 

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

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

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

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

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

原文地址https://www.cnblogs.com/cgzl/p/9786801.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复读数组(nowcoder 1103A)

正题 nowcoder 1103A 题目大意 有一个数组,将其复制k遍,求所有区间内不同元素个数的和 解题思路 同一个区间内有相同的数那么在最右边的数计算贡献 记 rrr 为右边第一个相等的数,那么贡献就是到 rrr 的距离乘上左边的数字个数&#xff08…

新疆大学ACM新生赛(公开赛)

A~D签到题,E稍微用点脑子?F经典分治题(lyd蓝书的袭击)反正分治算就行了复杂度2个log(用个归并能到1个log) A - hello world #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2…

P3214-[HNOI2011]卡农【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3214 题目大意 一个由1∼n1\sim n1∼n的所有整数构成的集合SSS,求出它的mmm个不同非空子集满足每个元素都出现了偶数次。 解题思路 集合的话不用考虑顺序,可以输出有序的答案除以m!m!m!就好了。 选…

Graph Coloring I

来源:牛客网: 题目描述 修修在黑板上画了一些无向连通图,他发现他可以将这些图的结点用两种颜色染色,满足相邻点不同色。 澜澜不服气,在黑板上画了一个三个点的完全图。修修跟澜澜说,这个图我能找到一个简…

Visual Studio 2017 15.9预览版3支持ARM64 for UWP

微软针对Visual Studio 2017 15.9的更新工作还在继续。在15.9的第三个预览版中,微软宣布支持ARM64平台上的UWP应用程序,并扩展了TypeScript开发人员可以使用的功能。和通常的情况一样,该版本还包含了大量的修复程序。UWP应用现在可以把ARM64平…

【树形DP】路径计数机(nowcoder 1103-B)

正题 nowcoder 1103-B 题目大意 给你一棵树,让你找两条不交的链,长度分别为a,b,问有多少中方案 解题思路 设fx,0∼3,yf_{x,0\sim 3,y}fx,0∼3,y​为在x的子树中,第1/2条链连了y条边,另一条链连完了/没连 然后对于每…

[ZJOI2007]矩阵游戏

来源:牛客网: 题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏。矩阵游戏在一个N *N黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。 每次可以对…

HHKB Programming Contest 2020 总结

A - Keyboard 签到题1 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio…

AT4996-[AGC034F]RNG and XOR【FWT,生成函数】

正题 题目链接:https://www.luogu.com.cn/problem/AT4996 题目大意 给出一个0∼2n−10\sim 2^n-10∼2n−1下标的数组ppp&#xff0c;pip_ipi​表示有pip_ipi​的权重概率选择iii。 开始有一个x0x0x0&#xff0c;每次选择一个数字yyy让xxxoryxx\ xor\ yxx xor y 对于每个iii…

如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...

目录设计重点流程图伪代码2.1. PublishEvent2.2. SubscribeEvent2.3. Publisher2.4. Subscriber微服务 强一致性3.1 Publisher3.2 Subscriber事件总线 - 跨服务 最终一致性4.1 Publisher & Subscriber 都开启了本地事务&#xff0c;保证了强一致性4.2 问题场景一&#xff1…

【状压DP】十二桥问题(nowcoder 1104-B)

正题 nowcoder 1104-B 题目大意 给你一个无向图&#xff0c;问你从1开始经过若干必要边&#xff0c;然后回到1的最短路径 解题思路 因为关键边较少&#xff0c;先从每个关键点跑一遍dij&#xff0c;得出最短距离 设fs,if_{s,i}fs,i​表示必要边的状态为s&#xff0c;当前在…

干货!请码住——点此领取免费开源框架

何谓框架框架&#xff08;Framework&#xff09;是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法; 框架是可被应用开发者定制的应用骨架。拥有一套企业级开发框架有哪些好处&#xff1f;对于一个软件公司或者互联网公司来说&#xff0c;开发…

YbtOJ#493-最大分数【斜率优化dp,分治】

正题 题目链接:http://172.17.55.160/contest/117/problem/1 题目大意 nnn个数的一个序列&#xff0c;给其中的一些数打上标记。 一个标记方案的贡献为s1s_1s1​表示有多少对L,RL,RL,R满足区间[L,R][L,R][L,R]都被打上了标记&#xff0c;s2s_2s2​表示标记的数字和。贡献为s1−…

大鱼吃小鱼

题目大意 给你若干数&#xff0c;让你分成若干组&#xff0c;每组两个&#xff0c;如果一组数中大的数大于等于小的数的两倍&#xff0c;那么有一点贡献&#xff0c;问贡献最大是多少 解题思路 先排序&#xff0c;然后分为大小两组&#xff0c;双指针看可以合多少组 code #i…

2018CCPC吉林赛区(重现赛)补题部分——F线段树待补

A - The Fool 数论分块暴力求和 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include&…

【dfs】年会小游戏

题目大意 给出n&#xff0c;问小于n的数中&#xff0c;因数最多的数 解题思路 要满足因数最多&#xff0c;则小的质因数个数要大于等于打的质因数个数 那么直接按这个需求dfs枚举每个质因数的指数 code #include<cstdio> #include<cstring> #include<iostre…

在 ASP.NET Core 中集成 Skywalking APM

前言大家好&#xff0c;今天给大家介绍一下如何在 ASP.NET Core 项目中集成 Skywalking&#xff0c;Skywalking 是 Apache 基金会下面的一个开源 APM 项目&#xff0c;有些同学可能会 APM 是干什么用的还不是太了解&#xff0c;那么下面我就简单的来说一下。APM 全称是 &#x…

YbtOJ-大收藏家【分层图,最大流】

正题 题目链接:https://www.ybtoj.com.cn/contest/117/problem/2 题目大意 nnn个人&#xff0c;每人有aia_iai​个属于自己的物品。mmm次交换依次进行&#xff0c;每次xi,yix_i,y_ixi​,yi​两个人可以决定拿不拿自己的一个物品进行交换。 求111号人最后能拿到最多多少种物品…

2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 Fishing Master

文章目录题意&#xff1a;题解&#xff1a;代码&#xff1a;题意&#xff1a; 你在钓鱼&#xff0c;每次钓鱼固定时间为k&#xff08;必定钓上一条鱼&#xff09;&#xff0c;池塘一共n条鱼&#xff0c;钓上鱼后要煮&#xff0c;每条鱼煮的时间不相同&#xff0c;可以在煮鱼的…

NWERC 2018——B.Brexit Negotiations

Brexit Negotiations 有向无环图&#xff0c;很容易想到拓扑排序&#xff0c;很明显我们需要把权值大的点放在最前面&#xff0c;然后就想到搞个优先队列&#xff0c;每次拓扑排序的时候出权值大的点&#xff0c;但是发现答案是不对的。 正向建图拓扑排序能够保证小的点一定最后…