如何在本地开发中从公共 API 测试 Webhook

已发表: 2022-08-26

Webhook 是一种用于接收来自不同系统的事件通知的机制,而无需不断地轮询它们。 也称为反向 API,它们可以被认为是提供消费系统需要实现的“API 规范”。 使用 webhook 的挑战之一是测试您为在本地开发环境中处理 webhook 而编写的代码。 在本文中,我将向您展示一些可用于在本地测试 webhook 的选项。

Webhook 是如何工作的?

随着世界变得越来越互联,您的应用程序更有可能需要从其他系统接收信息。 一种方法是定期轮询其他系统以查看是否有任何新信息可用,但您必须非常频繁地轮询以获得接近实时数据的信息。 一种更有效的方法是使用 webhook。

Webhook 本质上是源系统向目标系统中注册的 URL 发送的 HTTP 请求。 在编程术语中,webhook 可以被认为是观察者模式的一种实现。 这是消费系统注册以通过注册端点或 URL 来通知源系统中的事件的地方。

大多数源系统都支持安全措施,例如允许您在注册端点时配置基本身份验证或使用承载令牌进行身份验证。 当系统已注册通知的事件发生时,源系统向已注册的端点发送 HTTP 请求,其中包含与该事件有关的信息的有效负载。

Webhook 被现代 Web 应用程序广泛使用。 例如:

  • Paypal 使用即时付款通知 (IPN),它本质上是 webhook,用于在收到付款时发送通知。
  • 当推送事件发生时,GitHub 使用 webhook 通知 CI/CD 系统。
  • Slack 实现了传入的 webhook,允许任何系统发送发布到选定 Slack 通道的消息。

使用 Webhook

如前所述,webhook URL 可以被认为是消费系统需要实现的反向 API。 通常,通过使用 PHP 等编程语言编写代码来处理 webhook 请求。 在编写任何代码来处理通过 webhook 发送的信息之前,您需要清楚地了解有效负载的外观。 一旦您编写了一些代码来处理有效负载,您需要能够测试您的代码在接收到 webhook 时是否执行了它应该执行的操作,例如返回正确的状态代码。

检查有效负载和 Webhook 测试

Request Bin 等工具允许您创建可在源系统中配置的可公开访问的端点。 每当您注册的事件发生时,源系统都会向您的 bin 发送 HTTP GET 或 POST 请求,允许您检查有效负载。 Request Bin 还允许您查看标题等项目,使调试和故障排除更加容易。 要了解它是如何工作的,请前往 Request Bin 并单击“改为 Create a public bin ”的链接。 您将看到一个 URL,您可以将其配置为源系统中的端点。

例如,我按照 WooCommerce 文档中描述的步骤向我的 WooCommerce 网站添加了一个 webhook。 在“Delivery URL”字段中,我输入了 Request Bin 提供给我的 URL。

将 webhook 添加到 WooCommerce 网站。

当我创建订单时,WooCommerce 向配置的端点发送了一个 HTTP 请求,我能够通过访问请求箱中我的箱的 URL 立即检查有效负载。

检查请求箱中的 webhook 有效负载。

通常,您不希望创建公共垃圾箱,因为任何拥有垃圾箱 URL 的人都可以访问它。 通常最好创建一个私人垃圾箱,这需要您使用 Pipedream 创建一个帐户。

在本地接收 Webhook

在部署任何处理 webhook 的代码之前,您需要在开发环境中测试您的代码。 为此,您需要能够将本地端点公开为公共 URL,您可以将其配置为发送 webhook 的系统中的目标 URL。 有很多工具可供您执行此操作。

使用 ngrok 公开本地端点

可以说,将本地端点暴露给 Internet 的最广泛使用的工具是 ngrok。 要开始使用 ngrok,您需要创建一个免费帐户。

安装 ngrok 非常简单。 前往下载页面,为您的操作系统获取适当的二进制文件,解压缩,然后复制到您路径上的目录中。 在 Mac 上,您也可以使用 Homebrew 安装 ngrok:

冲泡安装 ngrok/ngrok/ngrok

安装 ngrok 后的下一步是添加 authtoken。 创建帐户并登录后,您可以通过访问仪表板获取令牌。

ngrok config add-authtoken (token)

现在您已准备好使用 ngrok 公开您的本地端点 URL。 假设您有一个在端口 80 上运行的 Web 应用程序。在您的终端中,键入ngrok http 80 。 您的输出应如下所示:

ngrok (Ctrl+C 退出)
                                                                                                                                                                                                                      
访问 http://localhost:4040/ 以检查、重放和修改您的请求                                                                                                                                             
                                                                                                                                                                                                                      
在线会话状态                                                                                                                                                                                  
帐户 Sanjucta Ghose(计划:免费)                                                                                                                                                             
版本 3.0.6                                                                                                                                                                                   
亚太地区 (ap)                                                                                                                                                                       
延迟 89 毫秒                                                                                                                                                                                    
网页界面 http://127.0.0.1:4040                                                                                                                                                                   
转发 https://deec-110-227-84-74.ap.ngrok.io -> http://localhost:80                                                                                                                           
                                                                                                                                                                                                                      
连接 ttl opn rt1 rt5 p50 p90                                                                                                                                             
                              0 0 0.00 0.00 0.00 0.00 

您现在有一个可公开访问的 URL, https://deec-110-227-84-74.ap.ngrok.io //deec-110-227-84-74.ap.ngrok.io,您可以在配置 webhook 时将其用作目标 URL。

Ngrok 提供了允许您配置其工作方式的开关和选项。 您可以通过ngrok -help查看哪些选项可用。

将 ngrok 与虚拟主机一起使用

您很可能通过虚拟主机为您的本地站点提供服务,这是一种允许您从单个 Web 服务器为多个域提供服务的机制。 Web 服务器通常通过检查 HTTP 请求的 Host 标头来确定应该为哪个网站提供服务来实现这一点。 要公开通过虚拟主机提供服务的站点,您需要让 ngrok 重写所有隧道请求的 Host 标头以匹配您的 Web 服务器的期望。 假设您有一个在http://hellfishmedia.test运行的本地站点。 要公开此站点,您可以使用以下命令:

ngrok http --host-header=hellfishmedia.test 80

在 WordPress 中使用 ngrok

如果您尝试使用 ngrok 公开的 URL 是 WordPress 端点,则文档描述了您需要做的几件事以确保其正常工作。

将 ngrok 与 Laravel Valet 一起使用

如果您是 macOS 用户并使用 Laravel Valet 作为本地开发环境,则无需单独安装 ngrok。 Valet 与 ngrok 的副本捆绑在一起,用于公开可公开访问的 URL。 您可以简单地导航到您的站点目录并使用valet share命令获取可公开访问的 URL。

如果您将站点关联到与站点目录名称不同的域,则在使用valet share命令时需要提及域名。 例如,如果您使用valet link hellfishmedia使您的网站在http://hellfishmedia.test可用,那么您还应该使用以下命令来获取可公开访问的 URL:

代客分享地狱鱼媒体

使用 Local 作为本地开发环境

Local by WP Engine 是一个非常受 WordPress 开发人员欢迎的本地开发环境。 Local 使得使用 Live Links 功能公开本地端点变得非常容易,而无需任何其他软件。

ngrok 的替代品

存在多种 ngrok 替代方案,它们允许您将本地端点公开到 Internet。 我在下面尝试了其中两个。

本地隧道

Localtunnel 是一种开源替代方案,它允许您在无需创建帐户的情况下公开本地端点。 但是,您需要安装 Node.js。

要安装 Localtunnel,请使用以下命令:

npm install -g localtunnel

要公开在localhost:80上运行的应用程序,请在终端上运行以下命令:

lt --port 80

如果您的本地应用程序通过位于http://hellfishmedia.test的虚拟主机运行,那么您可以使用localhost开关

lt --port 80 --localhost hellfishmedia.test

页风筝

Pagekite 是另一个允许您公开本地端点的服务。 它是用 Python 编写的,需要您在系统上安装 Python。 假设您在 Mac 上并安装了 Python 3.x,您可以通过在终端上键入以下内容快速开始:

curl -O https://pagekite.net/pk/pagekite.py

这将为您获取pagekite.py程序。 之后,您可以使用以下命令创建您的第一个“风筝”,并将 (yourname) 替换为您要用来识别风筝的名称:

python3 pagekite.py 80(你的名字).pagekite.me

首次运行此命令时,系统将提示您输入电子邮件地址以创建帐户。 随后,当您运行此命令时,您将需要通过输入密码来登录您的帐户。 上面的命令将使localhost:80(yourname).pagekite.me

要通过虚拟主机公开在hellfishmedia.test上运行的本地站点,可以使用以下命令:

pagekite.py deliciousbrains.test:80(你的名字).pagekite.me +rewritehost

结论

Webhook 是一种方便且现在几乎无处不在的系统通过 HTTP 进行通信的方式。 作为开发人员,您需要能够检查有效负载以处理 webhook,这正是 Request Bin 等服务派上用场的地方。 测试 webhook 处理代码意味着您需要将本地端点公开到 Internet。 包括 ngrok、Localtunnel 和 Pagekite 在内的大量服务使这成为可能。

您是否曾经必须编写代码来处理 webhook? 如果是这样,您使用什么工具来测试您的 webhook? 在评论中告诉我。