Google Webhook 的云 HTTP 功能:请求正文缺少数据
Google Cloud HTTP function by webhook: Request body is missing data
我将 Zoom API 与我的 Firebase 应用程序集成,为此我依赖 Zooms 预制网络钩子 运行 我的 Firebase 上的 HTTP 函数用于各种事件,例如 "meeting started" 和 "meeting ended"。缩放 API 参考:https://marketplace.zoom.us/docs/guides/webhooks
这是 Zoom API 正在调用的 Google 云函数:
exports.zoomTestA = functions.https.onCall((req, res) => {
console.log(req);
let data = req.body;
var xmlData = data.toString();
console.log(xmlData);
});
这是Zoom发送的payload:
{
"event": "meeting.ended",
"payload": {
"account_id": "LTf-KjgUTR2df-knT8BVEw",
"object": {
"duration": 0,
"start_time": "2019-05-07T14:02:51Z",
"timezone": "",
"topic": "Alexander Zoom Meeting",
"id": "864370042",
"type": 1,
"uuid": "2h/SWVrrQMu7fcbpLUly3g==",
"host_id": "Ty6ykNolSU2k1N4oc0NRcQ"
}
}
这导致此错误出现在我的 Google 云控制台中:
Request body is missing data. { event: 'meeting.ended',
payload:
{ account_id: 'LTf-KjgUTR2df-knT8BVEw',
object:
{ duration: 0,
start_time: '2019-04-30T14:23:44Z',
timezone: '',
topic: 'Alexander\'s Zoom Meeting',
id: '837578313',
type: 1,
uuid: 'WotbHO3RRpSviETStKEGYA==',
host_id: 'Ty6ykNolSU2k1N4oc0NRcQ' } } }
Zoom 发送的请求正文未按照 Google 云功能的要求包裹在 "data: {}" 标记中。如果您可以在此处控制有效负载,我已经找到了解决此问题的方法:。
我的问题是我无法更改 Zoom API 发送的请求。有什么方法我仍然可以在我的 Google 云功能中接受请求吗?或者有什么方法可以更改 Zoom 发送的请求的格式?我找不到任何一个参考资料。
一个可能的解决方案是设置另一个服务器来接收 Zoom 的请求,将其格式化为 Google 云功能规范,然后将其传递到我的 Google 云功能。但是,我想避免走出 Google 云生态系统。
这个问题在Google云平台上可以解决吗?
所以我想通了。在 Firebase / Google Cloud 函数中,您可以使用
创建 HTTP-functions
functions.https.onCall((req, res) => {
var data = req.body;
和
functions.https.onRequest((req, res) => {
var data = req.body;
不同之处似乎在于 onCall
是为在 Firebase/ Google 云功能环境中使用而设计的。但是,如果您需要外部函数,则需要使用 onRequest
,因为这不需要特定格式的有效负载。
使用 onRequest
解决了我所有的问题。
我将 Zoom API 与我的 Firebase 应用程序集成,为此我依赖 Zooms 预制网络钩子 运行 我的 Firebase 上的 HTTP 函数用于各种事件,例如 "meeting started" 和 "meeting ended"。缩放 API 参考:https://marketplace.zoom.us/docs/guides/webhooks
这是 Zoom API 正在调用的 Google 云函数:
exports.zoomTestA = functions.https.onCall((req, res) => {
console.log(req);
let data = req.body;
var xmlData = data.toString();
console.log(xmlData);
});
这是Zoom发送的payload:
{
"event": "meeting.ended",
"payload": {
"account_id": "LTf-KjgUTR2df-knT8BVEw",
"object": {
"duration": 0,
"start_time": "2019-05-07T14:02:51Z",
"timezone": "",
"topic": "Alexander Zoom Meeting",
"id": "864370042",
"type": 1,
"uuid": "2h/SWVrrQMu7fcbpLUly3g==",
"host_id": "Ty6ykNolSU2k1N4oc0NRcQ"
}
}
这导致此错误出现在我的 Google 云控制台中:
Request body is missing data. { event: 'meeting.ended',
payload:
{ account_id: 'LTf-KjgUTR2df-knT8BVEw',
object:
{ duration: 0,
start_time: '2019-04-30T14:23:44Z',
timezone: '',
topic: 'Alexander\'s Zoom Meeting',
id: '837578313',
type: 1,
uuid: 'WotbHO3RRpSviETStKEGYA==',
host_id: 'Ty6ykNolSU2k1N4oc0NRcQ' } } }
Zoom 发送的请求正文未按照 Google 云功能的要求包裹在 "data: {}" 标记中。如果您可以在此处控制有效负载,我已经找到了解决此问题的方法:
我的问题是我无法更改 Zoom API 发送的请求。有什么方法我仍然可以在我的 Google 云功能中接受请求吗?或者有什么方法可以更改 Zoom 发送的请求的格式?我找不到任何一个参考资料。
一个可能的解决方案是设置另一个服务器来接收 Zoom 的请求,将其格式化为 Google 云功能规范,然后将其传递到我的 Google 云功能。但是,我想避免走出 Google 云生态系统。
这个问题在Google云平台上可以解决吗?
所以我想通了。在 Firebase / Google Cloud 函数中,您可以使用
创建 HTTP-functionsfunctions.https.onCall((req, res) => {
var data = req.body;
和
functions.https.onRequest((req, res) => {
var data = req.body;
不同之处似乎在于 onCall
是为在 Firebase/ Google 云功能环境中使用而设计的。但是,如果您需要外部函数,则需要使用 onRequest
,因为这不需要特定格式的有效负载。
使用 onRequest
解决了我所有的问题。