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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/43486393/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 18:10:22  来源:igfitidea点击:

How to make an HTTP request in Cloud Functions for Firebase?

node.jsfirebasegoogle-cloud-functionsfirebase-cloud-functions

提问by Rashid Khan

I am trying to make a call to apples receipt verification server using Cloud Functions for Firebase. Any idea how to make an HTTP call?

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

回答by Dustin

Keep in mind that your dependency footprint will affect deployment and cold-start times. Here's how I use https.get()and functions.config()to ping other functions-backed endpoints. You can use the same approach when calling 3rd party services as well.

请记住,您的依赖足迹将影响部署和冷启动时间。下面是我如何使用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);
    });
});

回答by Sagar V

Answer is copied from OP's edit in question

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



OP solved this using https://github.com/request/request

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

回答by kemalony

mostly using https://nodejs.org/api/https.html

主要使用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