如何在 Cloud Functions for Firebase 中发出 HTTP 请求?

Posted

技术标签:

【中文标题】如何在 Cloud Functions for Firebase 中发出 HTTP 请求?【英文标题】:How to make an HTTP request in Cloud Functions for Firebase? 【发布时间】:2017-09-15 03:10:12 【问题描述】:

我正在尝试使用 Cloud Functions for Firebase 调用苹果收据验证服务器。知道如何进行 HTTP 调用吗?

【问题讨论】:

【参考方案1】:

答案是从 OP 的相关编辑中复制的


OP 使用https://github.com/request/request 解决了这个问题

var jsonObject = 
  'receipt-data': receiptData,
  password: functions.config().apple.iappassword
;
var jsonData = JSON.stringify(jsonObject);
var firebaseRef = '/' + fbRefHelper.getUserPaymentInfo(currentUser);
let url = "https://sandbox.itunes.apple.com/verifyReceipt"; //or production  
request.post(
  headers: 
    'content-type': 'application/x-www-form-urlencoded'
  ,
  url: url,
  body: jsonData
, function(error, response, body) 
  if (error) 
   else 
    var jsonResponse = JSON.parse(body);
    if (jsonResponse.status === 0) 
      console.log('Recipt Valid!');
     else 
      console.log('Recipt Invalid!.');
    
    if (jsonResponse.status === 0 && jsonResponse.environment !== 'Sandbox') 
      console.log('Response is in Production!');
    
    console.log('Done.');
  
);

【讨论】:

【参考方案2】:

主要使用https://nodejs.org/api/https.html

const http = require("http");
const https = require('https');
const mHostname ='www.yourdomain.info';
const mPath     = '/path/file.php?mode=markers';

       const options = 
               hostname: mHostname,
               port: 80, // should be 443 if https
               path: mPath ,
               method: 'GET',
               headers: 
                  'Content-Type': 'application/json'//; charset=utf-8',
                
       ;

 var rData=""
       const req0 = http.request(options, (res0)=>
       
          res0.setEncoding('utf8');

          res0.on('data',(d) =>
                   rData+=d;

           );
           res0.on('end',function()
                console.log("got pack");
                res.send("ok");
              );
      ).on('error', (e) => 
          const err= "Got error:"+e.message;
          res.send(err);
      );
req0.write("body");//to start request

【讨论】:

导入http模块为什么还要导入https模块? 忘记删除【参考方案3】:

请记住,您的 dependency footprint will affect deployment and cold-start times.以下是我使用https.get()functions.config() ping 其他功能支持的端点的方法。您也可以在调用 3rd 方服务时使用相同的方法。

const functions = require('firebase-functions');
const https = require('https');
const info = functions.config().info;

exports.cronHandler = functions.pubsub.topic('minutely-tick').onPublish((event) => 
    return new Promise((resolve, reject) => 
        const hostname = info.hostname;
        const pathname = info.pathname;
        let data = '';
        const request = https.get(`https://$hostname$pathname`, (res) => 
            res.on('data', (d) => 
                data += d;
            );
            res.on('end', resolve);
        );
        request.on('error', reject);
    );
);

【讨论】:

为什么request.on不在https.get()回调中,为什么不使用response.on('error')

以上是关于如何在 Cloud Functions for Firebase 中发出 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cloud Functions for Firebase 获取子值的键?

如何在 Cloud Functions for Firebase 中发出 HTTP 请求?

如何在 Cloud Functions for Firebase 中使 HTTP 请求异步/等待?

如何在 PC 上本地测试 Cloud Functions for Firebase

如何使用 Firestore 在 Cloud Functions for Firebase 中获取服务器时间戳?

如何在 Cloud Functions for Firebase 中访问多个实时数据库实例