Google Cloud功能可从第三方服务器获取数据

时间:2019-01-09 13:24:33

标签: node.js google-cloud-platform httprequest google-cloud-functions

我是Google Cloud Functions功能和实现的新手。因此,我想知道是否可以使用Cloud函数向第三方服务器API发出HTTP或HTTPS请求,如果可以,怎么办?当我收到响应数据时,可以使用相同的云函数实例将其存储到我的Firebase数据库中吗?

该如何定期调用此请求或安排该请求?预先感谢

2 个答案:

答案 0 :(得分:4)

以下是使用 node-fetch 的方法。

您的云功能:

const fetch = require('node-fetch');

exports.functionName= (req, res) => {
  const fetchFromURL = async () => await (await fetch('https://yourURL.com')).json();

  fetchFromURL().then((data) => {
    // do something with data (received from URL).
  });
};

您还需要将“node-fetch”依赖项添加到函数的 package.json 中。

您的 package.json:

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-fetch": "^2.6.1"
  }
}

答案 1 :(得分:2)

您可以使用node.js request-promise库来实现。

您可以按照以下方式进行操作,例如:

.....
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拥有的服务(例如您提到的“第三方服务器”),则需要采用“火焰”或“烈火”定价计划。

事实上,免费的“ Spark”计划“仅允许对Google拥有的服务进行出站网络请求”。请参见https://firebase.google.com/pricing/(将鼠标悬停在“云函数”标题之后的问号上)


评论后更新:

如果要触发对第三方服务器的调用,然后使用从该服务器接收到的数据填充Firebase Realtime数据库,则可以执行以下操作。我举了一个从请求承诺文档https://github.com/request/request-promise#get-something-from-a-json-rest-api中调用API的示例。

然后您将通过在线CRON作业(如https://www.easycron.com/)定期调用此Cloud Function。

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);
    });
});