Webhook 是一个 API 概念,是微服务 API 的使用范式之一,也被成为反向 API,即前端不主动发送请求,完全由后端推送;简单来说,就是访问指定网址时,执行一个指定脚本。
举个常用例子,比如你的好友发了一条朋友圈,后端将这条消息推送给所有其他好友的客户端,就是 Webhook 的典型场景。
对于我来说,想到的一个应用场景是:当访问i.scwy.net博客时,请求手机更新一次博客(手机脚本会判断是否需要更新)。由客户需求来主动发起更新,而不是由我每次写完后更新博客。完成了一次被动服务。
这里介绍使用golang编写的一个webhook工具。
Github
Hook示例
hooks.json
[
{
"id": "redeploy-webhook",
"execute-command": "/var/scripts/redeploy.sh",
"command-working-directory": "/var/webhook"
}
]
redeploy.sh
#!/bin/sh
...
运行服务器: webhook -hooks hooks.json -verbose
前端调用: http://yourserver:9000/hooks/redeploy-webhook
命令行参数:
-cert https证书指定 cert.pem
-debug 显示调试
-header
-hotreload 监视hooks文件更改并自动加载
-http-methods 全局限制允许http方法,用逗号分隔
-ip 服务使用的IP
-key https证书私钥文件 key.pem
-logfile 日志文件
-pidfile
-port 端口默认9000
-secure 使用https
-template 将hooks文件解析为go模板
-urlprefix url前缀,如 http://.../PREFIX/:hook-id
-verbose 详细输出
-x-request-id 使用X-Request-Id标头作为请求ID
配置文件
配置支持json和yaml两种格式
id 任务ID
execute-command shell脚本
response-message 成功返回值
http-methods 允许HTTP方法
trigger-rul 触发条件
response-message web服务返回信息
include-command-output-in-response web服务是否返回脚本输出信息
include-command-output-in-response-on-error 脚本出错信息是否返回web服务
pass-arguments-to-command 传递给命令(脚本)的参数
pass-environment-to-command 指定将作为环境变量传递给命令的参数列表
parse-parameters-as-json 指定包含JSON字符串的参数列表
pass-file-to-command 指定将序列化为文件的条目列表
trigger-rule-mismatch-http-response-code 指定不满足触发规则时要返回的HTTP状态代码
规则匹配中的来源可以为:url header json(payload)
示例
- 地址参数: curl http://…/hooks/test-webhook?token=ease
[
{
"id": "test-webhook",
"execute-command": "/home/ease/tools/webhook/test-webhook.sh",
"response-message": "Executing simple webhook...",
"command-working-directory": "/home/ease/tools/webhook",
"trigger-rule":
{
"match":
{
"type": "value",
"value": "ease",
"parameter":
{
"source": "url",
"name":"token"
}
}
}
}
]
- header参数: curl -H “token:ease” http://…/hooks/test-webhook
[
{
"id": "test-webhook",
"execute-command": "/home/ease/tools/webhook/test-webhook.sh",
"response-message": "Executing simple webhook...",
"command-working-directory": "/home/ease/tools/webhook",
"trigger-rule":
{
"match":
{
"type": "value",
"value": "ease",
"parameter":
{
"source": "header",
"name":"token"
}
}
}
}
]
- 将post请求中的id和header中的token传递给脚本
#!/bash/sh
echo $@, $1, $2
调用 curl -X POST -H “token:ease” -H ‘content-type: application/json’ -d ‘{“id”:“123456”}’ http://…/hooks/test-webhook
[
{
"id": "test-webhook",
"execute-command": "/home/ease/tools/webhook/test-webhook.sh",
"command-working-directory": "/home/ease/tools/webhook",
"include-command-output-in-response":true,
"include-command-output-in-response-on-error":true,
"pass-arguments-to-command":
[
{
"source": "payload",
"name": "id"
},
{
"source": "header",
"name": "token"
}
],
"trigger-rule":
{
"match":
{
"type": "value",
"value": "ease",
"parameter":
{
"source": "header",
"name":"token"
}
}
}
}
]