了解 Webhooks
在使用网络应用程序时,您是否尝试过更改当前网页上显示的信息?即使您没有意识到,您也可能已经通过计算机的客户端-服务器通信多次这样做过。
例如,您在计算机(客户端)上的 Web 应用程序用户界面中点击某个元素,然后您的计算机(客户端)会向应用程序的服务器发送 HTTP 请求。服务器随后会向您的设备发送响应,从而触发 Web 应用程序用户界面的变化。
但是,当 Web 应用程序的服务器想要根据远程服务器上发生的事情而不是用户操作来触发事件时,会发生什么呢?这就是 Webhook 的用武之地!
什么是Webhook?
Webhook 是一种服务器之间的“反向 HTTP 请求”,而不是客户端与服务器之间的通信。每当远程服务器端发生事件时,它都会向您应用程序服务器上的公共 URL 发送一个 HTTP POST 请求,以便您可以根据该更新在自己的应用程序中触发相应的事件。
探讨一些例子
现在您已经了解了什么是 webhook,让我们来看几个示例用例来巩固您的理解。
付款成功后触发操作
您有一个集成了第三方支付处理的电子商务网站。交易过程可能立即成功,但也可能延迟或出错。由于支付处理由外部服务完成,您无法直接访问他们那边的支付流程。但是,如果您希望在客户成功购买后触发应用程序上的某个事件,该怎么办呢?
顾客在您的网站上购物,该网站使用 Stripe 进行支付处理。购物完成后,您发送了一条感谢短信。Stripe 支持 Webhook,以便在购物成功时通知我们。您向 Stripe 提供一个您控制的 URL,Stripe 会立即收到购物详情。然后,您的应用程序会获取这些信息并发送一条短信作为回应。
等待成绩单
从 Deepgram 请求转录文本时,您可以等待其生成,但这可能比处理较大文件需要多花几秒钟时间。您可以通过在请求中包含回调功能来访问 Deepgram 的 webhook,该功能允许用户将转录结果重定向到您选择的 URL。
您的成绩单请求可以立即得到处理,让您即刻收到回复。同时,Deepgram 会在后台运行,并将结果通过您提供的 URL 发送到您的服务器。
由于您可以控制接收 Webhook 有效负载的应用程序,因此您可以构建任何其他业务逻辑,以便在获取数据后运行。例如:
- 向您的客户发送电子邮件,告知他们成绩单已完成并包含成绩。
- 将提供给服务器的转录文本翻译成应用程序用户界面上显示的格式。
- 向用户手机发送短信,简要预览结果。
使用 Node.js 实现 Webhooks
Webhook 消费者本质上就是一个路由处理器。它不会接收用户操作的请求,而是由发出 Webhook 的服务触发。以下是使用 Express 的示例:
// Require, initialize, and configure Express
const express = require('express');
const app = express();
app.use(express.json());
// This is the route handler our webhook will POST data to
app.post('/hook', (req, res) => {
/*
You could do anything here, such as:
Add data to a database
Trigger an email or SMS
Automatically schedule an event on your application's UI
*/
console.log(req.body); // See the data
res.status(200).end(); // Return empty response to server
})
// Start express server
app.listen(3000);
由于 Webhook 会向您的应用程序发送 POST 请求,因此您需要在应用程序中创建一个 POST 路由处理程序。假设我们的应用程序 URL 为 `<application_url>` https://myDIYstore.com,则 Webhook 消费者的 URL 将是 `<webhook_consumer_url> https://myDIYstore.com/hook`。
Webhooks 与轮询
在上面的示例中,我们看到远程服务器使用 Webhook 向我们的应用程序发送数据。然而,除了这种方法之外,还可以从应用程序的服务器轮询所选的远程服务器。
轮询是指您的服务器会定期且持续地请求检查远程服务器上是否有更新。如果有更新,服务器会返回请求的信息,您的应用程序即可停止检查。
使用 Webhook 和轮询的主要区别在于,Webhook 会在事件发生时立即从远程服务器向您的服务器发送请求。而轮询则是您的服务器定期发出请求,直到检测到远程服务器的更新为止。
要利用 Webhook,第三方服务需要支持该功能。如果第三方服务不支持 Webhook,则需要轮询更新。虽然这种方法会消耗应用程序更多资源,但有时可能是唯一的选择(或者在某些情况下,这可能是更合适的选择,但这超出了本文的讨论范围)。以下示例展示了在 Express 服务器上轮询的实现方式。
// Require cross-fetch library to bring fetch() to Node.js
const fetch = require('cross-fetch');
// Require and initialize Express
const express = require('express');
const app = express();
// Creating a function that once invoked, will poll repeatedly.
async function checkStatus() {
// Asynchronously making an HTTP GET request to our external API
let response = await fetch("external-api-example-here").then(r => r.json());
if (!response.data.status == 'completed') {
// If status not completed, rerun this function after 2 seconds
await new Promise(r => setTimeout(r, 2000));
await checkStatus();
} else {
// Criteria was met, continue with logic.
}
}
// Invoke the function you have just written
checkStatus();
// Start express server
app.listen(3000);
在这个例子中,我们会每 2 秒持续查询一次选定的第三方 API,直到满足条件为止。一旦满足条件,我们就执行业务逻辑,轮询停止。正如你所看到的,这种方法会消耗大量资源,发出许多请求却没有数据变化。然而,这可能是最合适(甚至是唯一)的选择,因此理解轮询和 Webhook 都很有价值。
一旦掌握了使用方法,Webhook 就成了一个非常方便且直观的工具!但需要注意的是,Webhook 必须得到你所请求数据的服务的支持才能正常工作!一些使用 Webhook 的平台包括 Deepgram、Twitter、Discord 和 Stripe。
如果您有任何疑问,请随时在 Twitter 上联系我们 - 我们的账号是@DeepgramDevs。
文章来源:https://dev.to/deepgram/understanding-webhooks-3ppl


