用于Opsani伺服组件的柔性webhook连接器

servo-webhooks的Python项目详细描述


伺服网络挂钩

Run TestslicensePyPIreleaseGitHub release dateDependabot Status

提供灵活的webhook的OpsaniServo连接器 基于servo events的发射器。在

webhooks连接器扩展了伺服提供的事件基础结构,以启用事件 通过HTTP或HTTP/2请求回调进行调度。请求在 尽最大努力。webhook可以注册为在中定义的任何事件之前执行,或者在之后执行 伺服总成。在事件发生之前,应该小心使用webhook,因为它们可能会阻止 事件挂起webhook的传递或通过响应完全取消事件(见下文)。 支持webhook请求的可配置自动重试和超时。在

Webhook请求通过HTTPPOST方法和JSON请求体发送。webhook请求主体 根据向伺服注册的事件的参数和返回值动态定义。 此机制将webhook连接器通用化,以支持任何连接器定义的任意事件 在伺服总成内。{JSON>可以获取头文件 通过webhooksCLI子命令(参见下面的用法)。在

配置

webhooks:-name:my_measure_handler# Optional. Name of the webhook.    description:Store measurement info into Elastic Search.# Optional: Textual description of the webhookevents:-after:measure# Required. Format: `(before|after):[EVENT_NAME]`url:https://example.com/webhooks# Required. Format: [URL]secret:s3cr3t# Required. Secret value for computing webhook signaturesheaders:# Optional, Dict[str, str]-name:x-some-headervalue:some valuebackoff:# Optional. Setting to `false` disables retries.max_tries:3max_time:5m

起始点配置可以通过:servo generate --defaults webhooks添加到伺服组件。在

Webhook请求示例

TODO:为几个事件插入头和请求正文

^{pr2}$

为了方便起见,servo webhook包含在默认servox程序集Docker images中。在

使用

  1. 正在列出webhook:servo webhooks list
  2. 正在获取事件内容类型和负载架构:servo webhooks schema after:measure
  3. 触发特别网络挂钩:servo webhooks trigger after:adjust ([NAME|URL])

实现Webhook响应程序

TODO:内容类型等标题。包括连接器版本、其他事件元数据。架构版本控制。在

验证Webhook签名

所有的webhook请求都用X-Servo-Signature头发送。此标头的值是十六进制 HMACSHA1摘要的字符串表示形式,使用 webhook配置中的secret键。签名可以很容易地验证以验证 webhook负载的真实性和完整性。所有主要平台都支持HMAC计算 在大多数现代编程语言的标准库中。在

从Python中的webhook请求计算HMAC SHA1摘要的示例如下:

secret="super secret authentication code"expected_signature=request.headers["x-servo-signature"]body=request.read()signature=str(hmac.new(secret.encode(),body,hashlib.sha1).hexdigest())assertsignature==expected_signature

通过Webhook取消活动

假设您想要实现一个webhook,它实现基于条件的调整授权 比如只允许他们在午夜和凌晨3点。为了实现这一点,webhook响应程序将 返回一个200(OK)状态代码和一个对servo.errors.CancelEventError对象建模的响应体。servo-webhooks 连接器将反序列化CancelEventError表示,并在 程序集,取消事件。要指示响应体是CancelEventError错误的表示, 将Content-Type头设置为application/vnd.opsani.servo.errors.CancelEventError+json,并返回一个JSON对象 其中包含一个描述事件取消原因的reason属性: TODO:取消的最佳状态代码/响应是什么? 返回一个200(OK)响应,其中Content-Type为:

> POST http://webhooks.example.com/servo-webhooks
> Content-Type: application/vnd.opsani.servo.events.Event+json # TODO: Not the right content type
> {
>  ...
> }

< 200 (OK)
< Content-Type: application/vnd.opsani.servo.errors.CancelEventError+json
< {
<  "reason": "Unable to authorize adjustment: Adjustments are only permitted between midnight and 3am."
< }

配置退避重试和超时

TODO:禁用回退以避免在before处理程序上阻塞。在

技术细节

Webhook请求在内存中以非持久方式进行管理。请求通过异步httpx发出 客户端建立在asyncio之上。对webhook请求主体JSON模式的支持通过 servox中Pydantic的深度集成。支持的退避和重试通过 backoff库。在

测试

自动化测试通过Pytest:pytest test_servo_webhooks.py实现

许可证

ServoWebhooks是根据Apache2.0开源条款发布的许可证。在

许可证的副本在存储库根目录下的LICENSE文件中提供。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JavaFX TableView更新单元格,不更新对象值   在扫描器中使用分隔符的java   java OkHttp 4.9.2,连接无法重用,导致端口耗尽   eclipse中的c JNI:运行Java代码   java是否在出厂的所有硬件设备中都有/mnt/sdcard/Android/data文件夹(或等效文件夹)?   Java,在eclipse中访问资源文件夹中的图像   java为什么Bluemix dashDB操作抛出SqlSyntaxErrorException,SQLCODE=1667?   JavaHtmlUnitWebClient。getPage不处理javascript   Google API认证的java问题   java如何将JSON数组反序列化为Apache beam PCollection<javaObject>   ServerSocket停止接收命令,java/安卓   来自Java类的安卓 Toast消息   java如何自动重新加载应用程序引擎开发服务器?   java是否可以尝试/捕获一些东西来检查是否抛出了异常?   java如何做到这一点当我按下load game时,它不仅会加载信息,还会将您带到游戏中?   Java选项Xmx代表什么?   Java映射,它在插入时打印值   设置“ulimit c unlimited”后,java无法生成系统核心转储