如何在快递服务器内进行外部 API 调用?

Posted

技术标签:

【中文标题】如何在快递服务器内进行外部 API 调用?【英文标题】:How to make a external API call inside express server? 【发布时间】:2017-03-06 11:24:39 【问题描述】:

您好,我一直在尝试在我的仪表板上实现 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);
);

谢谢!

【问题讨论】:

【参考方案1】:

我想知道是否可以在 express 内部进行 API 外部调用 服务器。

当然,您可以使用http.request()(如您所展示)或在此基础上构建的更高级别模块之一(如request module)从 node.js 应用程序联系任何外部服务器。

这是请求模块主页的一个简单示例:

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

或者,使用承诺:

 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)现在处于维护模式,不会积极开发以添加新功能。你可以阅读更多关于推理的信息here。 this table 中有一个备选方案列表,其中对每个备选方案进行了一些讨论。我自己一直在使用got(),它从一开始就是使用 Promise 构建的,而且使用简单。

【讨论】:

【参考方案2】:

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

在处理需要更复杂事件链的代码时,使用 Promises 是一个很大的优势。编写异步代码可能会让人感到困惑,Promises 是解决这个问题的几种解决方案之一。

首先使用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);
    );

【讨论】:

【参考方案3】:

请尝试此解决方案。我用过它,它对我有用。

var Request = require("request");

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

【讨论】:

【参考方案4】:

您可以使用request-promise-native,它使用原生 ES6 承诺。

安装 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);
);

【讨论】:

以上是关于如何在快递服务器内进行外部 API 调用?的主要内容,如果未能解决你的问题,请参考以下文章

快递100电商快递地图轨迹推送服务API接口案例代码

如何在 ECS Fargate 部署的容器外部进行外部 api 调用

调用第三方快递物流公司API接口即时查询信息方法

使用外部 WCF 服务时,在 docker 内运行的 Dotnet 核心 Web api 无法进行身份验证

thinkphp如何使用快递鸟-查看快递物流查询api接口

用JS进行Base64编码,MD5加密,实现签名验证 调用快递鸟API接口 完成快递单号查询 JavaScript