6

前言

最近在看老师写的历史代码的时候,发现了在健康系统和图像标注系统都用到了WebHook,还有在之前项目配置钉钉机器人的时候也用到了WebHook一直没了解过是如果进行信息推送的,只知道配置了能根据条件进行推送,没有去研究原理(其实就是缺少探索精神,学编程的大忌),基于此,就有了这个关于webhook的实践文章

image.png

WebHook是什么

WebHook 直译是网络钩子,可以把 WebHook 看做一种通知方式,只要发生关注的事件,就会发送通知到我们指定的 Web 服务。这是一种用于将数据从一个应用程序移动到另一个应用程序的单向通信格式。

Webhook 通信是通过从源应用程序向目标应用程序发送 HTTP 请求来实现的。当源应用程序中发生事件时,将触发可能包含与该事件相关的数据的 HTTP 请求。此 HTTP 请求将发送到目标应用程序的终结点(通常称为 Webhook URL)。

WebHooks和轮询的区别

Webhooks:邮递员(邮件服务器)在有新邮件时直接将邮件送到你的家(你的服务器地址)。
轮询: 你(客户端)每隔一段时间去邮局(邮件服务器)检查是否有新邮件。

Webhooks:适合需要实时响应和高效资源利用的场景,特别是事件驱动的通知和集成。
轮询:适用于不需要高实时性且需要主动控制数据请求频率的场景,尽管效率较低,但实现相对简单可靠。

image.png

基于github WebHook案例

GitHub 允许我们配置 WebHook ,它允许我们配置仓库发生某个事件时,通知指定我们的web服务。比如当指定仓库有提交代码、创建issue、关闭issue、评论issue等等触发事件的时候,GitHub 将向我们配置的 API 发送 POST 请求。

配置Webhooks

github创建webhooks有两种方式,一种是在项目仓库中的设置找到webhooks新建,一种是通过api接口请求的方式进行创建

通过访达方式新建webhooks

访问 GitHub 仓库的 Webhooks 设置页面,打开仓库的 Settings 配置页面,点击 Webhook Tab 页。

点击 Add webhook 按钮。

image.png

image.png

通过api的方式新建webhooks

github WebHooks网址

https://docs.github.com/en/rest/repos/webhooks?apiVersion=2022-11-28#create-a-repository-webhook

通过这里发现,我们可以通过post请求的方式进行创建

这里我采用postman的方式进行请求

/repos/{owner}/{repo}/hooks
curl -L \
  -X POST \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer <YOUR-TOKEN>" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/OWNER/REPO/hooks \
  -d '{"name":"web","active":true,"events":["push","pull_request"],"config":{"url":"https://example.com/webhook","content_type":"json","insecure_ssl":"0"}}'

当你使用api接口的方式进行创建webhooks时候,头部文件需要一个Authorization认证,所以这时候就要去创建一个token ,在右边头像 -》 setting -> deveploperSetting 中进行创建

image.png

我们这里personal access_tokens 创建一个access_token 访问

image.png

这样我们就生成了一个access_token

image.png

https://api.github.com/repos/kexiaobin11/angular-springboot/hooks

image.png

通过查看webhooks已经创建了

image.png

Java 验证 WebHook触发事件

这里我们编写一个我们签名写需要回推的web api接口

@RestController()
@RequestMapping("api")
public class ApiController {
    private static final Logger log = LoggerFactory.getLogger(ApiController.class);

    @PostMapping("/github/webhooks")
    public void githubWebhooks(@RequestBody String payload) {
        log.info(payload);
        System.out.println("payload: " + payload);
    }
}

我们通过github创建一个issue

image.png

查看web服务终端查看是否触发事件进行回推数据

image.png

这里我们看到github的issue号是5,证明当前测试webhooks没有问题

总结

之前也想过2个系统数据的回推,之前思考这个问题,但是没有去实践,最开始的想法是web服务通过轮询的方式进行请求去查看是否有触发事件,这样做一个弊端,隔一段时间就进行请求,会无故浪费资源。使用webhooks的方式很完美的解决了资源浪费的问题。这篇测试文章在创建webhooks没有使用secret密钥生成签名,根据签名进行校验数据完整性。存在即合理。详细可以查看官网关于webhook handleEvent。这里就没有过多赘述。

相关文档

https://docs.github.com/en/rest/repos/webhooks?apiVersion=2022-11-28#create-a-repository-webhook

https://docs.github.com/en/webhooks/using-webhooks/handling-webhook-deliveries

https://hookdeck.com/webhooks/guides/when-to-use-webhooks


kexb
519 声望16 粉丝