Как сделать внешний вызов API внутри экспресс-сервера?
Здравствуйте, я пытаюсь реализовать OneSignal API на своей панели инструментов, и мне интересно, можно ли сделать внешний вызов 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
Интересно, можно ли сделать внешний вызов API внутри экспресс-сервера.
Конечно, вы можете связаться с любым внешним сервером из приложения node.js с помощью http.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.
}
});
Или, используя обещания:
const rp = require('request-promise');
rp('http://www.google.com').then(body => {
console.log(body);
}).catch(err => {
console.log(err);
});
Ответ 2
Вы можете использовать клиент Axios, так как Axios - это HTTP-клиент, основанный на Promise для браузера, а также node.js.
Использование Promises - это большое преимущество при работе с кодом, который требует более сложной цепочки событий. Написание асинхронного кода может привести к путанице, и Promises - одно из нескольких решений этой проблемы.
Сначала установите Axios в свое приложение, используя npm install axios --save
и тогда вы можете использовать этот код
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));
});