如何让Hasura REST端点接收Azure Event Grid的无根键数组请求?
问题
尝试将Hasura REST端点作为Azure Event Grid订阅的Webhook,但Azure发送的验证Payload是无根键的数组结构:
[ { "id": "2d1781af-3a4c-4d7c-bd0c-xxxxxxxxxxx", "topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "subject": "", "data": { "validationCode": "512d38b6-c7b8-40c8-89fe-xxxxxxxxxxx", "validationUrl": "https://rp-eastus2.eventgrid.azure.net:553/eventsubscriptions/myeventsub/validate?id=0000000000-0000-0000-0000-00000000000000&t=2022-10-28T04:23:35.1981776Z&apiVersion=2018-05-01-preview&token=1A1A1A1A" }, "eventType": "Microsoft.EventGrid.SubscriptionValidationEvent", "eventTime": "2022-10-28T04:23:35.1981776Z", "metadataVersion": "1", "dataVersion": "1" } ]
Hasura中定义的用于包装为REST端点的Mutation如下:
mutation ProcessEvent($events: [EventInput]!) { storage_event_handshake(event: $events) { validationResponse } }
调用时会抛出错误:
{ "code": "validation-failed", "error": "expecting a value for non-nullable variable: \"events\"", "path": "$" }
手动将Azure的Payload用events根键包裹后可正常运行,但无法修改Azure发送的Payload格式,需要找到让Hasura直接接收这种数组结构的方法,同时支持后续事件通知处理。
解决方案
方法1:使用Hasura请求转换(推荐)
Hasura的REST端点内置请求转换功能,可在控制台配置规则,自动将Azure发送的顶层数组包装为Hasura需要的格式:
- 进入Hasura控制台,打开
REST API页面,找到对应的ProcessEvent端点配置 - 在
Request Transformation区域,选择JSONata作为转换语言,输入以下表达式:{"events": $} - 保存配置后,Hasura会自动将Azure的数组请求转换为
{"events": [/* 原数组内容 */]}的格式,匹配Mutation的变量要求
方法2:自定义Resolver接收数组
若需要更灵活的处理逻辑,可创建自定义Resolver直接接收顶层数组:
- 在Hasura中创建自定义Resolver,指定其接收的请求体为数组类型
- 将Resolver与
storage_event_handshake函数绑定,直接把请求数组作为参数传入 - 该方法需编写自定义业务代码,适合复杂事件处理场景
方法3:中间层代理服务
如果Hasura内置转换无法满足需求,可搭建简单的中间代理:
- 代理服务接收Azure的数组请求
- 将请求体包装为
{"events": 原数组}格式后转发给Hasura REST端点 - 将Hasura的响应原样返回给Azure
- 适合需要额外处理(如日志、事件过滤)的场景
内容的提问来源于stack exchange,提问作者HelmBurger
相关产品推荐
相关产品推荐

