HTTP-функция Google Cloud с помощью веб-перехватчика: в теле запроса отсутствуют данные

Я интегрирую Zoom API с моим приложением Firebase, и для этого я полагаюсь на готовые веб-перехватчики Zooms для запуска функции HTTP в моей Firebase для различных событий, таких как «собрание началось» и «собрание закончилось». Справочник по API Zoom: https://marketplace.zoom.us/docs/guides/webhooks

Это функция Google Cloud, которую вызывает API Zoom:

exports.zoomTestA = functions.https.onCall((req, res) => {
    console.log(req);
    let data = req.body;
    var xmlData = data.toString();
    console.log(xmlData);
});

Вот данные, отправленные Zoom:

{
  "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 Cloud:

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, не заключено в тег "data: {}", как того требуют функции Google Cloud. Я нашел решения этой проблемы, если вы можете контролировать полезную нагрузку здесь: Dart json.encode не кодируется, как того требует функция Firebase.

Моя проблема в том, что я не могу изменить запрос, отправляемый API Zoom. Могу ли я принять запрос в моей функции Google Cloud? Или есть способ изменить формат запроса, отправляемого Zoom? Я не могу найти ссылки ни на один из них.

Одним из возможных решений было бы настроить другой сервер, который получает запрос от Zoom, отформатировать его в соответствии со спецификациями функций Google Cloud, а затем передать его моей функции Google Cloud. Однако я бы не хотел выходить за рамки экосистемы Google Cloud.

Можно ли решить эту проблему на платформе Google Cloud?


person NoteTheNote    schedule 07.05.2019    source источник
comment
Покажите нам код, который вы используете для отправки в Firebase.   -  person Chris White    schedule 07.05.2019
comment
Я добавил код функции Firebase и полезной нагрузки Zoom, но, как уже упоминалось, проблема в том, что я не контролирую запрос, отправленный Zoom.   -  person NoteTheNote    schedule 07.05.2019


Ответы (1)


Вот и разобрался. В функциях Firebase / Google Cloud вы можете создавать HTTP-функции с

functions.https.onCall((req, res) => { var data = req.body;

а также

functions.https.onRequest((req, res) => { var data = req.body;

Разница в том, что onCall предназначена для использования в среде функций Firebase / Google Cloud. Однако, если вам нужны внешние функции, вам нужно использовать onRequest, поскольку это не требует специального форматирования полезной нагрузки.

Использование onRequest вместо этого решило все мои проблемы.

person NoteTheNote    schedule 26.06.2019
comment
Когда вы меняете с onCall на onRequest, объект req немного отличается. С onCall req фактически содержит любые параметры сообщения, переданные в функцию, а с onRequest вам нужно получить req.body. Также с onCall вы можете вернуть объект JS, но с onRequest вам нужно сделать res.json(returnData). Только что обнаружил это при преобразовании моей собственной функции и хотел помочь всем, кто сталкивается с той же проблемой. - person Tim; 04.02.2021