Функция Google Cloud для получения данных со стороннего сервера - PullRequest
0 голосов
/ 09 января 2019

Я новичок в функциях и реализации облачных функций Google. Итак, я хочу знать, можно ли сделать HTTP или HTTPS-запрос к стороннему API сервера с помощью функции Cloud, и если да, то как? И когда я получаю данные в ответ, могу ли я сохранить их в своей базе данных Firebase, используя тот же экземпляр облачной функции?

А как сделать так, чтобы этот запрос периодически вызывался или планировался? Заранее спасибо

1 Ответ

0 голосов
/ 09 января 2019

Для этого вы можете использовать библиотеку node.js request-prom .

Вы могли бы сделать что-то вроде этого, например:

.....
var rp = require('request-promise');
.....

exports.yourCloudFunction = functions.database.ref('/parent/{childId}')
    .onCreate((snapshot, context) => {
      // Grab the current value of what was written to the Realtime Database.
      const createdData = snapshot.val();

      var options = {
          url: 'https://.......',
          method: 'POST',
          body: ....  
          json: true // Automatically stringifies the body to JSON
      };

      return rp(options);

    });

Если вы хотите передать параметры в вызываемую службу / конечную точку HTTP (S), вы можете сделать это через тело запроса, например:

  .....
  const createdData = snapshot.val();

  var options = {
      url: 'https://.......',
      method: 'POST',
      body: {
          some: createdData.someFieldName
      },
      json: true // Automatically stringifies the body to JSON
  };
  .....

или через несколько пар ключ-значение строки запроса, например:

  .....
  const createdData = snapshot.val();
  const queryStringObject = { 
     some: createdData.someFieldName,
     another: createdData.anotherFieldName
  };

  var options = {
      url: 'https://.......',
      method: 'POST',
      qs: queryStringObject
  };
  .....

ВАЖНО:

Обратите внимание, что если вы планируете звонить в службу, не принадлежащую Google (например, упомянутый вами "сторонний сервер"), вам необходимо использовать тарифный план "Flame" или "Blaze".

На самом деле, бесплатный план «Spark» «разрешает исходящие сетевые запросы только в сервисы, принадлежащие Google». См. https://firebase.google.com/pricing/ (наведите курсор мыши на знак вопроса, расположенный после заголовка «Облачные функции»)


ОБНОВЛЕНИЕ ПО СЛЕДУЮЩЕМУ КОММЕНТАРИЮ:

Если вы хотите инициировать вызов на сторонний сервер, а затем заполнить базу данных Firebase Realtime данными, полученными с этого сервера, вы можете сделать следующее. Я взял пример вызова API из документации запроса-обещания: https://github.com/request/request-promise#get-something-from-a-json-rest-api.

Затем вы будете регулярно вызывать эту облачную функцию с помощью онлайн-задания CRON, например https://www.easycron.com/.

exports.saveCallToAPI = functions.https.onRequest((req, res) => {
  var options = {
    uri: 'https://api.github.com/user/repos',
    headers: {
      'User-Agent': 'Request-Promise'
    },
    json: true // Automatically parses the JSON string in the response
  };

  rp(options)
    .then(repos => {
      console.log('User has %d repos', repos.length);

      const dbRef = admin.database().ref('userName'); //For example we write to a userName node
      var newItemRef = dbRef.push();
      return newItemRef.set({
        nbrOfRepos: repos.length
      });
    })
    .then(ref => {
      response.send('Success');
    })
    .catch(error => {
      response.status(500).send(error);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...