本教程将介绍 webhook 的概念。我们还将构建一个可以接收 GitHub webhook 的简单 Flask 服务器。我们还将看到如何公开我们的本地主机。

什么是 webhook?

在谈论 webhook 之前,让我们先谈谈 API。以下是 API 的数据流。

API 数据流

您向 API 发出 GET/POST 请求并得到响应。如果您想了解有关使用 API 的更多信息,请查看我关于使用 Python 使用API 的文章或我关于使用 JavaScript 使用API 的文章。

考虑一下 Github API,如果我们想构建一个每次在 repo 中出现新问题时都会发送电子邮件的 API。一种方法是构建一个 API,它每 1-2 分钟发出一次请求,以检查是否有新问题发生并通知我们。这个过程称为轮询。基本上,我们必须定期提出请求以检查新问题。但是,这似乎效率低下。如果 GitHub 在创建新问题时向我们的 API 发出请求怎么办。这称为 webhook。我们不需要定期发出请求,而是将我们的 API 端点提供给 GitHub,每当创建新问题时,都会向我们提供给 Github 的端点发出请求。 Webhook 也称为反向 API。下面是轮询和 webhook 之间的比较。这张图片的灵感来自这篇文章

轮询与 WebHooks

您可能已经注意到,发出了很多请求,并且根据我们发出请求的频率,在创建新问题和我们的 API 收到通知之间可能会有一点延迟。

让我们创建一个 API 来在 Github 存储库中创建新问题时接收请求。

创建一个简单的Flask Server

首先,让我们创建一个 hello world 端点。

https://gist.github.com/rahulbanerjee26/617d073669e78b538fabccfe3219515c

现在我们需要创建一个端点来接收来自 GitHub API 的请求。这将是一个接受 POST 请求的标准端点。

https://gist.github.com/rahulbanerjee26/4de2f9e12331616f63f078bcf9d064bd

我阅读了文档并知道 JSON 对象的键。您可以使用不同的键来访问更多数据,例如问题标签等。

现在你可以运行你的烧瓶服务器了

python3 __init__.py

公开我们的 localhost URL

Webhook 需要公共 API 端点,因为它们无法向诸如“http://127.0.0.1:5000/”之类的端点发出请求。一种方法是部署 API 并使用已部署 API 的 URL。另一种方法是将您的本地主机公开为公开可用的 URL。这将是临时的,并且仅在您的 Flask 服务器正在运行时才有效。对公共 URL 发出的任何请求也将发送到您的 localhost URL。

我们将使用ngrok来公开我们的 localhost URL。您必须创建一个帐户。

屏幕截图 2021-10-26 at 1.41.52 AM.png为您的操作系统下载 ngrok 并解压缩。现在打开一个终端并 cd 到解压缩的 ngrok 文件所在的目录。在终端中输入以下命令

ngrok  http <PORT NUMBER>

例如:如果您的烧瓶服务器在端口 5000 上运行,您必须输入以下内容

ngrok http 5000

屏幕截图 2021-10-26 at 1.38.25 AM.png您应该在终端中看到类似的输出。公共 URL 是“转发”旁边的 URL。就我而言,它是35cc-69-58-102-156.ngrok.io。如果您访问您的公共 URL,您应该会看到与访问 localhost URL 时相同的内容。

创建问题 Webhook

选择你喜欢的任何 Github Repo。转到设置> Webhook > 添加 Webhook 屏幕截图 2021-10-26 在 1.40.56 AM.png

屏幕截图 2021-10-26 在 1.43.52 AM.png

输入你的端点,在我的例子中是35cc-69-58-102-156.ngrok.io/githubIssue

由于我们只希望在 repo 中创建问题时发出请求,因此选择“让我选择单个事件”。并向下滚动以选择“问题”。向下滚动后,向下滚动并创建 webhook。

测试 Webhook

在你的仓库中创建一个问题

屏幕截图 2021-10-26 上午 1.47.09.png

现在检查运行烧瓶服务器的终端。我还添加了一个标签并关闭了这个问题。

屏幕截图 2021-10-26 在 1.48.43 AM.png

结论

现在 Flask 服务器并没有做太多事情。但是,您可以在它之上构建。您可以使用数据并发送推送通知或电子邮件,而不仅仅是打印收到的数据。我希望你觉得这篇文章有帮助。在上联系 领英,推特

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐