# 测试 web 挂钩

了解如何测试 Webhook 和测试处理 Webhook 交付的代码。

## 关于测试 Webhook

可以测试 Webhook 的交付。 这样，您就可以验证 GitHub 是否会在响应您预期会触发 Webhook 传送的事件时发送 Webhook 传送。

还可以使用电脑或 codespace 作为本地服务器，并将 Webhook 交付转发到本地服务器来测试处理 Webhook 交付的代码。 这样就可以在无需将代码部署到生产服务器的情况下开发和调试代码。

## 测试 Webhook 交付

您可以触发 webhook 事件，并验证 GitHub 已发送 webhook 投递。

1. 触发 Webhook。 例如，如果正在测试 `issues` 事件的存储库 Webhook，可以在配置 Webhook 的存储库中提出问题。

   也可以重新交付先前的 Webhook 交付。 有关详细信息，请参阅“[重新传递 Webhook](/zh/enterprise-server@3.22/webhooks/testing-and-troubleshooting-webhooks/redelivering-webhooks)”。

   如果你使用组织或存储库 Webhook，还可以使用 REST API 为 Webhook 触发 `ping` 事件。 如果你使用存储库 Webhook 并且 Webhook 订阅了该 `push` 事件，则可以使用 REST API 为 Webhook 触发测试 `push` 事件。 有关详细信息，请参阅 [存储库 Webhook 的 REST API 终结点](/zh/enterprise-server@3.22/rest/repos/webhooks) 和 [用于组织 Webhooks 的 REST API 接口节点](/zh/enterprise-server@3.22/rest/orgs/webhooks)。

2. 检查 GitHub 以验证是否已发送 Webhook 传递。 若要了解如何为每个 Webhook 类型执行此操作，请参阅“[查看 web 挂钩交付](/zh/enterprise-server@3.22/webhooks/testing-and-troubleshooting-webhooks/viewing-webhook-deliveries)”。

如果 Webhook 投递未发送，或者 Webhook 投递虽已发送但 GitHub 表示该投递失败，请参阅故障排除指南以帮助诊断问题。 有关详细信息，请参阅“[Webhook 疑难解答](/zh/enterprise-server@3.22/webhooks/testing-and-troubleshooting-webhooks/troubleshooting-webhooks)”。

## 在本地测试 Webhook 代码

若要在你的计算机或 codespace 中本地测试 webhook 代码，你可以使用 webhook 代理 URL，将来自 GitHub 的 webhook 转发到你的计算机或 codespace。 可以使用电脑或 codespace 作为本地服务器来接收这些转发的 Webhook。

以下部分演示如何使用 smee.io 提供 Webhook 代理 URL 和转发 Webhook。

有关代码和测试步骤的特定示例，请参阅“[处理 Webhook 交付](/zh/enterprise-server@3.22/webhooks/using-webhooks/handling-webhook-deliveries)”。

### 获取 Webhook 代理 URL

1. 在浏览器中，导航到  <https://smee.io/> 。
2. 单击**启动新频道**。
3. 复制“Webhook 代理 URL”下的完整 URL。 后续设置步骤会用到此 URL。

### 将 Webhook 配置为使用 Webhook 代理 URL

将 Webhook 配置为使用上述 Webhook 代理 URL。 有关详细信息，请参阅 [创建网络钩子](/zh/enterprise-server@3.22/webhooks/using-webhooks/creating-webhooks) 和 [测试 Webhook](/zh/enterprise-server@3.22/webhooks/using-webhooks/editing-webhooks)。

现在， GitHub 将向该 URL 发送 Webhook 传送。

### 启动本地服务器

在电脑或 codespace 上启动本地服务器。 执行此操作的方式取决于接收 Webhook 的代码是如何编写的。 有关示例，请参阅“[处理 Webhook 交付](/zh/enterprise-server@3.22/webhooks/using-webhooks/handling-webhook-deliveries)”。

应确保代码可以在本地运行。 例如，如果代码取决于生产环境中的服务器上的环境变量，则应确保本地服务器上也提供了环境变量。

还可以发现添加日志语句很有用，以便可以验证代码的步骤是否按预期执行。

在测试 Webhook 时保持本地服务器运行。

### 转发 Webhook

1. 如果尚未安装 [smee-client](https://www.npmjs.com/package/smee-client)，请在终端中运行以下命令：

   ```shell copy
   npm install --global smee-client
   ```

2. 若要通过 smee.io 接收转发的 Webhook，请在终端中运行以下命令。 将 `WEBHOOK_PROXY_URL` 替换为前面提到的 Webhook 代理 URL。 将 `PATH` 替换为服务器将处理的路径或路由。 将 `PORT` 替换为本地服务器正在侦听的端口。

   ```shell copy
   smee --url WEBHOOK_PROXY_URL --path /PATH --port PORT
   ```

   应会看到如下所示的输出，其中的占位符 `WEBHOOK_PROXY_URL`、`PORT` 和 `PATH` 替换为指定的值：

   ```shell copy
   Forwarding WEBHOOK_PROXY_URL to http://127.0.0.1:PORT/PATH
   Connected WEBHOOK_PROXY_URL
   ```

   现在，当你的 Webhook 代理 URL（smee.io URL）收到来自 GitHub 的 Webhook 交付时，smee 会将该 Webhook 交付转发到你的本地服务器。

3. 在测试 Webhook 时保持此运行状态。 如果要停止转发 Webhook，请输入 <kbd>Ctrl</kbd>+<kbd>C</kbd>。

此时，您应该同时运行本地服务器和 smee 转发服务。

### 触发 Webhook 交付

触发 Webhook。 例如，如果正在测试 `issues` 事件的存储库 Webhook，可以在配置 Webhook 的存储库中提出问题。

也可以重新交付先前的 Webhook 交付。 有关详细信息，请参阅“[重新传递 Webhook](/zh/enterprise-server@3.22/webhooks/testing-and-troubleshooting-webhooks/redelivering-webhooks)”。

### 验证交付

您可以验证 GitHub 是否发送了 Webhook 交付，smee 是否接收并转发了该交付，以及您的本地服务器是否处理了该 Webhook 交付。

#### 验证 GitHub 是否已发送投递

检查 GitHub 以验证是否已发送 Webhook 传递。 有关详细信息，请参阅“[查看 web 挂钩交付](/zh/enterprise-server@3.22/webhooks/testing-and-troubleshooting-webhooks/viewing-webhook-deliveries)”。

如果 Webhook 投递未发送，或者 Webhook 投递虽已发送但 GitHub 表示该投递失败，请参阅故障排除指南以帮助诊断问题。 有关详细信息，请参阅“[Webhook 疑难解答](/zh/enterprise-server@3.22/webhooks/testing-and-troubleshooting-webhooks/troubleshooting-webhooks)”。

#### 验证 smee 是否已接收 Webhook 数据

在 smee.io 上导航到 Webhook 代理 URL。 应该会看到与已触发或已重新交付事件对应的事件。 这表示 GitHub 已成功将 Webhook 投递到你指定的载荷 URL。

如果在 smee.io 上未看到 Webhook 交付，请验证 Webhook 是否使用 Webhook 代理 URL (smee.io URL)。

#### 验证 smee 是否已转发 Webhook 交付

在运行 `smee --url WEBHOOK_PROXY_URL --path /PATH --port PORT` 的终端窗口中，应该会看到类似 `POST http://127.0.0.1:3000/webhook - 202` 的内容。 这表示 smee 已成功将 Webhook 转发到本地服务器。

如果没有看到此内容，则请确保 smee 客户端和本地服务器都正在运行。 应在两个单独的终端窗口中运行这些进程。

您也应该检查正在运行 smee 客户端和本地服务器时的终端窗口中是否有错误。 具体错误取决于用来接收 Webhook 的代码是如何编写的。 有关示例，请参阅“[处理 Webhook 交付](/zh/enterprise-server@3.22/webhooks/using-webhooks/handling-webhook-deliveries)”。

#### 验证本地服务器是否已处理 Webhook 交付

此时，你已经验证：GitHub 已发送 webhook 递送，且 smee 已将该递送转发到你的本地服务器。 现在，应验证代码是否按预期处理了 Webhook 交付。 执行此操作的方式取决于接收 Webhook 的代码是如何编写的。 有关示例，请参阅“[处理 Webhook 交付](/zh/enterprise-server@3.22/webhooks/using-webhooks/handling-webhook-deliveries)”。