A webhook, also known as a web callback, is a method that enables an app or web service to send real-time information to another application.
API:Client 找 Server 要信息。
Webhook:Reverse API, Server 主动发信息给 Client。
Webhook 的好处:Client 不用一直找 Server 要 data,减少无效沟通次数。
假如 Client 需要非常频繁地收到 Server 的信息,就要保持 connection 一直畅通(用 TCP 长连接,本文略过)。
既然 Webhook 适用于 Server 向 Client 推送信息这个场景,那我们要怎么建立它们之间的沟通渠道呢?
首先呢,Client 接收信息的地址要准备好;
其次,Server 配置好接收信息的 URL,发送数据的格式(基本上都是 json),以及能够触发沟通的事件(比如:git push)。
配置好了以后,每当特定的事件发生时,Server 就会发送一个 POST 请求到这个 URL,这个请求中包含着事件相关的信息(Payload)。
PS: Payload 的数据大小并不是重点,关键要详细,因为我们是发送一个 POST 请求给 Client,Client 需要根据 payload 里面的信息来进行相关操作。
Server 发送了信息之后,收到信息的 Client 应该干什么呢?
一种比较常见的方式是:
既然 Webhook 是 Server 主动给 Client 发信息,假如我们的 Client 被恶意 Server 骚扰了怎么办??
为了保证发信息的 Server 是一个正直友好的服务器,我们可以在配置 Webhook 的时候加入 Secret 来做保护。
这个保护措施是可选的,但是强烈建议大家使用!!
PS:也有一些 Client 不支持 secret,请根据自己的应用场景来查看文档和示例哦~
在这个例子里面,GitHub 是 Server,你接收信息的 App 是 Client。
ruby -rsecurerandom -e 'puts SecureRandom.hex(32)'
secret=xxxxx
X-Hub-Signature-256
);