如何在Express服务器内调用外部API?

26

你好,我一直在尝试在我的仪表板上实现OneSignal API,并且想知道是否可以在express服务器内部进行API外部调用。

这里有一个示例:

var sendNotification = function(data) {
  var headers = {
    "Content-Type": "application/json; charset=utf-8",
    "Authorization": "Basic NGEwMGZmMjItY2NkNy0xMWUzLTk5ZDUtMDAwYzI5NDBlNjJj"
  };

  var options = {
    host: "onesignal.com",
    port: 443,
    path: "/api/v1/notifications",
    method: "POST",
    headers: headers
  };

  var https = require('https');
  var req = https.request(options, function(res) {  
    res.on('data', function(data) {
      console.log("Response:");
      console.log(JSON.parse(data));
    });
  });

  req.on('error', function(e) {
    console.log("ERROR:");
    console.log(e);
  });

  req.write(JSON.stringify(data));
  req.end();
};

这里是应用程序路由。

app.post('/path', function(req, res){


var message = { 
  app_id: "5eb5a37e-b458-11e3-ac11-000c2940e62c",
  contents: {"en": "English Message"},
  included_segments: ["All"]
};

sendNotification(message);
});
谢谢你!
5个回答

27
我想知道在express服务器内是否可以进行API外部调用。
当然,你可以使用http.request()或类似request模块等基于其上层的模块从node.js应用程序中联系任何外部服务器。
以下是来自request模块主页的简单示例:
const request = require('request');
request('http://www.google.com', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // Show the HTML for the Google homepage. 
  }
});

或者,使用 promises:

 const rp = require('request-promise');
 rp('http://www.google.com').then(body => {
     console.log(body);
 }).catch(err => {
     console.log(err);
 });

2020年1月更新 - request()模块处于维护模式

请注意,request模块及其衍生模块,如request-promise现在处于维护模式,不会积极开发以添加新功能。您可以在这里了解更多原因。这个表格中列出了一些可供选择的替代方案(链接),并对每个替代方案进行了一些讨论。 我自己一直在使用got(),它从一开始就使用promises构建,非常容易使用。


14

你可以使用Axios客户端,因为Axios是基于Promise的HTTP客户端,适用于浏览器和node.js。

在处理需要更复杂事件链的代码时,使用Promises是一个很大的优势。编写异步代码可能会变得混乱,而Promise是解决此问题的几种解决方案之一。

首先,使用npm install axios --save在您的应用程序中安装Axios。

然后,您可以使用此代码。

const axios = require('axios');

axios.get('api-url')
    .then(response => {
        console.log(response.data.status);
        // console.log(response.data);
        res.send(response.data.status);
    })
    .catch(error => {
        console.log(error);
    });

1

请试用这个解决方案。我使用过它,对我很有效。

var Request = require("request");

Request.get("http://httpbin.org/ip", (error, response, body) => {
    if(error) {
        return console.dir(error);
    }
    console.dir(JSON.parse(body));
});


1

2022 更新

NodeJS 18+ 中提供了内建的 fetch API,不再需要第三方的 npm 模块。

(async () => {
    const res = await fetch('https://dummyjson.com/products/1')
    if (res.ok) {
        const data = await res.json()
        console.log(data)
    }
})()

更多细节请参阅官方博客


1
你可以使用request-promise-native,它使用了原生的ES6 promises。
安装request-promise-native包。
npm install --save request
npm install --save request-promise-native

按以下方式使用:

const request = require('request-promise-native');

const options = {
    method: 'GET',
    uri: 'https://www.google.com'
}

request(options).then(response => {
    console.log(response);
}, error => {
    console.log(error);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接