当现在的应用变的越来越像 API 的集合而且无服务架构获得越来越多的关注时,作为一个 API 的提供者,不应该再只是暴露传统的 REST 接口。
传统 REST API 的设计是用来让你可以程序化的获取或提交内容,但在你只是想如果某些信息改变,API 再通知应用程序的情况下,传统 API 还远不够好,这还远远不是最佳的实践。如果是要实现这个的话,就需要定期轮询,而且这样还会失去扩展性。
Picture credits Lorna Mitchell
为了获取一小段信息,轮询 API 通常是一种既浪费又复杂的方式。一些事件或许在一段时间内只发生一次,所以你必须推断出轮询的频率。然而即使这样你也可能错过它。
Don’t call us, we’ll call you!
好的,webhook 就是这个问题的答案. webhook 就是 Web 服务使用 HTTP POST 请求为其他服务提供近实时信息的一种方式。
Picture credits Lorna Mitchell
一个 webhook 会在它调用时就传递数据到其它的应用,这表明你可以立即得到数据。这让使用了 webhook 的生产者和消费者都变的更有效率,如果你的 API 还不支持这些,你真应该做一些关于这方面的事。 (关注 Salesforce 了吗?).
当涉及到 webhooks 的设计,现在并没有类似标准的 HTTP API 这样的规范。每个服务实现不同的 webhook, 从而导致许多不同的 webhooks 实现风格。
我们在集成了来自 100 多个不同服务 API 后,可以说对外提供 webhook 的服务是个大“杀器”。当我们需要集成一个暴露 webhook 的服务时,这里有些建议能够帮助到我们。
一个好的 webhook 服务应该要尽可能多的提供被通知事件的信息,以及客户端执行该事件的其他信息。
客户端在创建 POST 请求的时候应该包含一个 timestamp 和 webhook_id 字段。如果你提供的是不同类型的 webhooks,不管它们是否被发送到单个端点都应该包含一个 type 属性。
Github webhook 携带数据的示例
GitHub 非常完美的实现了以上这点。 请不要像 Instagram 或 Eventbrite 那样,只发送一个 ID 然后使用另一个 API 来解析。
如果你认为你的在一次请求中发送的有效数据太多,请给我机会让它变的更轻量。
Stripe’s event types 就是一个很好的例子。
当你构建你的 webhooks ,你应该考虑到在另一端的人必须去接收你的数据。如果只给予他们在一个网址下订阅活动的机会,那肯定不是你所可以提供的最好的开发者体验。如果我需要在不同的系统上监听相同的事件就会遇到麻烦,然后我就需要把类似 Reflector.io 的库来在系统间管理数据。Clearbit 请开发这样的好的 API, 并相应加快你的 webhook 开发进程。
Intercom 在这方面做的非常好,让你可以添加多个 URLs,并为其中的每一个都定义想监听的事件。
Intercom 的 webhook 管理面板
一旦整合完成,我们应该如何处理实际订阅的创建?一些服务选择了使用 UI 来引导你完成订阅的设置,其他服务则为此提供了 API。
Slack 两种都支持。
它提供了一个精巧的UI,这使创建订阅很容易,并且它也提供了一个稳定的事件 API(仍然没有提供尽可能多的事件,比如说他们的实时消息传递 API ,但我相信他们的工作)
在选择是否为 Webhooks 提供 API 时,需要记住的一件重要的事情是,订阅将以什么规模和粒度提供,以及谁将会配置它们。
我发现让人感到好奇的是像 MailChimp 这样的工具会迫使非技术的群体混淆 webhooks 配置。这些工具通过 API 提供 webhooks ,任何具有 Mailchimp 集成的第三方服务(例如 Stamplay,Zapier 或 IFTTT)都可以通过程序化的方式来实现,从而提供更好的用户体验。
要通过 API 创建新的 webhooks 订阅,你就应该像 HTTP API 中的任何其他资源一样来处理 订阅 。
最近我们在工作中发现非常好的例子是由 Box 团队在今年夏天更新的 webhook 实现。
一旦有人配置他的服务从你的 webhook 接收有效信息,它将会监听任何发送到端点的有效信息。
如果消费者的应用程序会暴露敏感信息,那么它可以(可选)验证请求是否由你的服务生成的,而不是第三方假装是你。这种验证不是必需的,但为消息传输提供了一个额外的验证层。
现在有很多方法可以实现安全性,如果你想把安全性处理放在消费者一方,你可以选择给他一个白名单来接受指定IP地址的请求,但更容易的方法是设置一个秘密令牌并验证相关信息。
这方面可以从不同程度的复杂性开始做,比如说就像 Slack 或 Facebook 做的那样,在一开始使用一个纯文本共享的秘钥。
至于更复杂的实现。比如说 Mandrill 对 webhook 请求进行签名,webhook POST 请求的 HTTP 头部包含了附加的X-Mandrill-Signature ,这个头中将包含请求的签名。要验证 Webhook 请求,就要使用 Mandrill 相同的**生成签名,并将这个签名与X-Mandrill-Signature 头里的值进行比较。
现在对外提供整合了过期时间的订阅服务可能性不是很高,但可以我们可以看到这可以作为一个更常见的功能。 Microsoft Graph API 就是一个例子。除非你进行续订,否则通过 API 执行的任何订阅都将在 72 小时后过期。
从数据提供商的角度来看,这是有道理的。你不想继续向可能不再运行或对你数据感兴趣的服务发送 POST 请求,但对所有真正对此感兴趣的用户来说,这是一个令人不快的体验。你是微软:如果你做不了应该做的繁重工作那又应该谁去做呢?
webhook 领域的设计仍然是分散的,但是常见的模式终究会显露出来。
来源:https://yq.aliyun.com/articles/226776
在公司的机器的工作机和测试机上做了实验,发现配置过程还是有点复杂的。故做一下小的分享。 另外,这个工具的共享剪切板的功能非常好用。可以直接在测试机上做屏幕截图,然后在工作机上打开画图板粘贴。 不过这款软件有个缺点,两台机器会共享焦点。在做自动化测试的时候不能随意切换屏幕,否则会造成焦点丢失,造成测试错误。 安装过程略。 配置过程: 1.选中“Share this computer's ...
1.先编写自己的函数公式 函数名后面的括号中要有式中包含的变量 2.定义响应,类型选择为function,dequation选择刚才设置的函数 点击edit,输入函数表达式中变量对应的响应个数,并分别选择对应哪个响应 返回,点击create,创建成功...
简介: 为什么需要边缘云原生?边缘云原生的技术特性和优势是什么?它可以为行业提供哪些关键能力?又有哪些场景适合边缘云原生呢?在MEC全球应用开发者大会的“MEC开放论坛”上,阿里云高级技术专家周哲进行了《阿里边缘云原生应用实践》主题分享,站在技术视角对边缘云原生的技术概念、应用场景、阿里云边缘云原生实践案例等多方面进行解读。 近日,MEC全球应用开发者大会隆重召开...
如何在2016office里面添加aurora 这是我自己安装的过程,有点神奇,但是效果达到了。 上图: 操作步骤: 1. 首先安装64位2016office(推荐安装,不要自定义),我新买的电脑所以是正版2016office。 2. 为了安装2010 32位office,我卸载了2016 office,但是它还存在于我的电脑里面,但是它还存在于我的电脑里面,但是它还存在于我的电脑里面,(重要的事...
从官网下载VMware和Centos 8镜像文件 VMware Workstation Pro :VMware官网下载 VMware15Pro** :转载 Centos 8镜像 :镜像下载 安装Centos 8镜像 打开VMware并创建新的虚拟机 选择自定义安装 未截图部分默认下一步,选择镜像文件 设置名称,用户名,密码 设置虚拟机名称和安装目录 设置虚拟机属性与配置 虚拟机配置和属性设置完成 ...
超大规模云计算中心、电子商务和社交网络数据中心,正面临着数据类型复杂的工作负载加速之难题。 数据中心加速的主要途径 传统CPU处理能力的需要突破已经成为共识,目前的途径主要有以下几类: 途径一,ASIC:经历了几十年的发展演变,为专门目的而设计的ASIC,由于面向特定用户的需求,在加速效率上可圈可点。但是,设计周期长、成本贵、应用范围窄的通病,使ASIC仅适合于批量很大或者对产品成本不计较的场合。...
原因:未知,可能是本地版本跟远程版本对不上 总之现象是,本地版本push 不到远程,远程拉取下来又覆盖本地。 解决办法: 1、本地创建分支test 然后将test提交到远程仓库 2、本地切换到 master 分支,拉取master最新下来。然后合并远程 test 到master 3、推送本地master到远程 ,然后后面在master开发就正常了 搞定 ...
8.1 准备实验样本 8.2 正式起航 首先,我们需要理解ArrayList的工作方式。在ArrayList初始化时,默认会分配10个数组空间。当数组空间消耗完毕后,ArrayList就会进行自动扩容。在每次add()函数时,系统总要事先检查一下内部空间是否满足所需的大小,如果不满足,就会扩容,否则就正常添加元素。多线程共同访问ArrayList的问题在于:在ArrayList容量快用完时(只有1...
光阴似箭,时光如梭。转眼间2017年已经过去了,在这一年里,很多事情完成了,但是没完成的更多。 在这一年里买了两次书,总计十多本。原本打算全部看完,却只看了几本,甚至还有三本没有开封。虽说毕业这一年很忙,但是我想更多是因为自己的懒惰。2017年未看完的书,在2018年里面继续,并且希望自己再看一些关于自律、心理及人生规划方面的书。 第二个就是运动。在2017年里面,在一段时间里曾坚持每天夜跑一个多...
UML图是一种将软件密集系统进行可视化的建模语言。 主要应用于开发阶段,说明,可视化,构建和书写面向对象工程项目开放的方法。 我们以这篇文章的为例: 工厂设计模式 我们可以设计出的UML图: 由于目前CSDN不支持类图,我们就手动写 这个图代表了一个类,分为三层,第一层是类名,如果是抽象类且用斜体表示。第二层是类的特性,通常指字段和属性。第三层指的是类的操作,也就是类所包含的方法或者行为。前面符号...
data as displayed output I can do it in a slow way of 1) creating NA for all new variables; 2) fill it on condition if(Type=="A"){ Var1_A <- Var1 } else if(..)} But I was wondering if the...
We have in code one-liner used to add header to file. It looks like perl -pi -e 'print "name, function, group\n" if $. == 1' CSV_FILE_NAME Everything is fine except when CSV_FILE_NAME is emp...
I'm just trying this link but I'm stuck in "Add the Google Services plugin" step... I just added the dependency they said but Android Studio' console is showing me this error: Could not find...
I have a table which contains about 900K rows.I want to delete about 90% of the rows. Tried using TABLESAMPLE to select them randomly but didn't get much performance improvement. Here are the queries ...
I was trying to plot some predicted vs. actual data, something that resembles the following: The plot looks like this: The only issue I have with this plot is the red border surrounding the legend ite...