(摘) Webhook

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

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)
示例
  1. 地址参数: 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"
           }
       }
    }
 }
]
  1. 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"
           }
       }
    }
 }
]
  1. 将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"
           }
       }
    }
 }
]