Як зробити віддалений REST-дзвінок всередині Node.js? будь-який CURL?


189

У Node.js , крім використання дочірнього процесу для здійснення CURL- дзвінка, чи є спосіб здійснити виклик CURL на REST API віддаленого сервера та отримати дані повернення?

Мені також потрібно встановити заголовок запиту на віддалений виклик REST , а також рядок запиту, також в GET (або POST).

Я знаходжу це: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

але він не відображає жодного способу до POST-рядка запиту.


Відповіді:


212

Подивись на http.request

var options = {
  host: url,
  port: 80,
  path: '/resource?id=foo&bar=baz',
  method: 'POST'
};

http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
}).end();

3
Отже, навіть якщо це POST, я також додаю дані в рядок запиту?
murvinlai

3
@murvinlai не впевнений. Ідіть, читайте документи, джерело, специфікацію HTTP. Не експерт у цьому регіоні.
Райнос

15
Варто зазначити, що ви не вводите http або https у свій хост-запис, наприклад var options = {host: graph.facebook.com ....} not {host: http: graph.facebook.com}. Це спалахнуло мене на кілька циклів. (Дивись нижче). Це обидва чудові відповіді. Дякую вам обом.
бінаргігант

9
Чи можу я лише зазначити, що якщо відповідь довга, використання res.on ('даних', ..) недостатньо. Я вважаю, що правильний спосіб - це також мати res.on ('end' ..), щоб знати, коли ви отримали всі дані. Потім ви можете обробити.
Xerri

4
Це дуже стара відповідь - для тих, хто пише вузол js сьогодні, ви б неодмінно використовували npmjs.com/package/node-fetch або інший пакет на основі API, який базується на стандарті Fetch. Дивіться мою відповідь нижче.
saille

95

Як щодо використання запиту - спрощений клієнт HTTP .

Редагувати лютий 2020 року: Запит застарілий, тому ви, ймовірно, більше не повинні його використовувати.

Ось GET:

var request = require('request');
request('http://www.google.com', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body) // Print the google web page.
     }
})

ОП також хотів POST:

request.post('http://service.com/upload', {form:{key:'value'}})

1
Відмінно працює з google.com, але повертає "RequestError: Помилка: вимкнення сокета" при запиті графіку api у facebook. Будь ласка, керівництво, дякую!
Динамічний Ремо

Цей модуль містить багато питань!
Пратік Сінгал

Як я можу передати параметр запиту під час використання API REST таким чином?
vdenotaris

2
Станом на 11 лютого 2020 року, запит повністю ВИДАЛЕНО. Ви можете побачити це на веб-сайті github.com/request/request#deprecated
Садіел

Будь-які вказівки щодо того, якими новачками слід користуватися? Я фільтрую через багато прикладів, які використовують це.
Steve3p0

36

Подивіться на http://isolasoftware.it/2012/05/28/call-rest-api-with-node-js/

var https = require('https');

/**
 * HOW TO Make an HTTP Call - GET
 */
// options for GET
var optionsget = {
    host : 'graph.facebook.com', // here only the domain name
    // (no http/https !)
    port : 443,
    path : '/youscada', // the rest of the url with parameters if needed
    method : 'GET' // do GET
};

console.info('Options prepared:');
console.info(optionsget);
console.info('Do the GET call');

// do the GET request
var reqGet = https.request(optionsget, function(res) {
    console.log("statusCode: ", res.statusCode);
    // uncomment it for header details
//  console.log("headers: ", res.headers);


    res.on('data', function(d) {
        console.info('GET result:\n');
        process.stdout.write(d);
        console.info('\n\nCall completed');
    });

});

reqGet.end();
reqGet.on('error', function(e) {
    console.error(e);
});

/**
 * HOW TO Make an HTTP Call - POST
 */
// do a POST request
// create the JSON object
jsonObject = JSON.stringify({
    "message" : "The web of things is approaching, let do some tests to be ready!",
    "name" : "Test message posted with node.js",
    "caption" : "Some tests with node.js",
    "link" : "http://www.youscada.com",
    "description" : "this is a description",
    "picture" : "http://youscada.com/wp-content/uploads/2012/05/logo2.png",
    "actions" : [ {
        "name" : "youSCADA",
        "link" : "http://www.youscada.com"
    } ]
});

// prepare the header
var postheaders = {
    'Content-Type' : 'application/json',
    'Content-Length' : Buffer.byteLength(jsonObject, 'utf8')
};

// the post options
var optionspost = {
    host : 'graph.facebook.com',
    port : 443,
    path : '/youscada/feed?access_token=your_api_key',
    method : 'POST',
    headers : postheaders
};

console.info('Options prepared:');
console.info(optionspost);
console.info('Do the POST call');

// do the POST call
var reqPost = https.request(optionspost, function(res) {
    console.log("statusCode: ", res.statusCode);
    // uncomment it for header details
//  console.log("headers: ", res.headers);

    res.on('data', function(d) {
        console.info('POST result:\n');
        process.stdout.write(d);
        console.info('\n\nPOST completed');
    });
});

// write the json data
reqPost.write(jsonObject);
reqPost.end();
reqPost.on('error', function(e) {
    console.error(e);
});

/**
 * Get Message - GET
 */
// options for GET
var optionsgetmsg = {
    host : 'graph.facebook.com', // here only the domain name
    // (no http/https !)
    port : 443,
    path : '/youscada/feed?access_token=you_api_key', // the rest of the url with parameters if needed
    method : 'GET' // do GET
};

console.info('Options prepared:');
console.info(optionsgetmsg);
console.info('Do the GET call');

// do the GET request
var reqGet = https.request(optionsgetmsg, function(res) {
    console.log("statusCode: ", res.statusCode);
    // uncomment it for header details
//  console.log("headers: ", res.headers);


    res.on('data', function(d) {
        console.info('GET result after POST:\n');
        process.stdout.write(d);
        console.info('\n\nCall completed');
    });

});

reqGet.end();
reqGet.on('error', function(e) {
    console.error(e);
});

1
Як отримати доступ до значень із d ??? d = {"data": [{"id": 1111, "name": "peter"}]}. як отримати значення імені?
пітер

2
вдалося отримати значення за допомогою var thed = JSON.parse (d); console.log ("ідентифікатор є:" + thed.data [0] .id); Але деякий час я отримую "Неочікуваний кінець введення"
peter

33

Я використовую node-fetch, оскільки він використовує знайомий (якщо ви веб-розробник ) API fetch () . fetch () - це новий спосіб робити довільні запити HTTP з браузера.

Так, я знаю, що це питання js-вузла, але чи не хочемо ми зменшувати кількість розробників API для запам'ятовування та розуміння та покращення повторної використання нашого коду javascript? Fetch - це стандарт, то як щодо цього ми сходимось?

Інша приємна річ щодо fetch () - це те, що він повертає обіцянку javascript , тож ви можете написати асинхронний код таким чином:

let fetch = require('node-fetch');

fetch('http://localhost', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{}'
}).then(response => {
  return response.json();
}).catch(err => {console.log(err);});

Вилучення замінює XMLHTTPRequest . Ось додаткова інформація .


Проблема node-fetchпри написанні API полягає в тому, що лише ті, хто працює, матимуть повну URL-адресу і не працюватимуть із відносними URL-адресами.
Себастьян


5

Аксіос

Приклад (axios_example.js) з використанням Axios в Node.js:

const axios = require('axios');
const express = require('express');
const app = express();
const port = process.env.PORT || 5000;

app.get('/search', function(req, res) {
    let query = req.query.queryStr;
    let url = `https://your.service.org?query=${query}`;

    axios({
        method:'get',
        url,
        auth: {
            username: 'the_username',
            password: 'the_password'
        }
    })
    .then(function (response) {
        res.send(JSON.stringify(response.data));
    })
    .catch(function (error) {
        console.log(error);
    });
});

var server = app.listen(port);

Будьте впевнені, що у своєму каталозі проекту ви робите:

npm init
npm install express
npm install axios
node axios_example.js

Потім ви можете протестувати API REST Node.js за допомогою свого браузера за адресою: http://localhost:5000/search?queryStr=xxxxxxxxx

Так само ви можете робити публікації, такі як:

axios({
  method: 'post',
  url: 'https://your.service.org/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});

СуперАгент

Аналогічно можна використовувати SuperAgent.

superagent.get('https://your.service.org?query=xxxx')
.end((err, response) => {
    if (err) { return console.log(err); }
    res.send(JSON.stringify(response.body));
});

І якщо ви хочете зробити основну автентифікацію:

superagent.get('https://your.service.org?query=xxxx')
.auth('the_username', 'the_password')
.end((err, response) => {
    if (err) { return console.log(err); }
    res.send(JSON.stringify(response.body));
});

Довідка:


5

Використання останніх функцій Async / Await

https://www.npmjs.com/package/request-promise-native

npm install --save request
npm install --save request-promise-native

// код

async function getData (){
    try{
          var rp = require ('request-promise-native');
          var options = {
          uri:'https://reqres.in/api/users/2',
          json:true
        };

        var response = await rp(options);
        return response;
    }catch(error){
        throw error;
    }        
}

try{
    console.log(getData());
}catch(error){
    console.log(error);
}

4

ще один приклад - для цього вам потрібно встановити модуль запиту

var request = require('request');
function get_trustyou(trust_you_id, callback) {
    var options = {
        uri : 'https://api.trustyou.com/hotels/'+trust_you_id+'/seal.json',
        method : 'GET'
    }; 
    var res = '';
    request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            res = body;
        }
        else {
            res = 'Not Found';
        }
        callback(res);
    });
}

get_trustyou("674fa44c-1fbd-4275-aa72-a20f262372cd", function(resp){
    console.log(resp);
});

4
var http = require('http');
var url = process.argv[2];

http.get(url, function(response) {
  var finalData = "";

  response.on("data", function (data) {
    finalData += data.toString();
  });

  response.on("end", function() {
    console.log(finalData.length);
    console.log(finalData.toString());
  });

});

3

Я не знайшов жодного із cURL, тому я написав обгортку навколо node-libcurl і його можна знайти за адресою https://www.npmjs.com/package/vps-rest-client .

Зробити пошту так:

var host = 'https://api.budgetvm.com/v2/dns/record';
var key = 'some___key';
var domain_id = 'some___id';

var rest = require('vps-rest-client');
var client = rest.createClient(key, {
  verbose: false
});

var post = {
  domain: domain_id,
  record: 'test.example.net',
  type: 'A',
  content: '111.111.111.111'
};

client.post(host, post).then(function(resp) {
  console.info(resp);

  if (resp.success === true) {
    // some action
  }
  client.close();
}).catch((err) => console.info(err));

2

Якщо у вас Node.js 4.4+, погляньте на команду reqclient , вона дозволяє вам здійснювати дзвінки та реєструвати запити у стилі CURL , щоб ви могли легко перевіряти та відтворювати дзвінки поза додатком.

Повертає об'єкти Promise замість передачі простих зворотних дзвінків, тож ви можете обробити результат більш "модним" способом, легко ланцюжок результатів та обробляти помилки стандартним чином. Також видаляється безліч конфігурацій шаблону для кожного запиту: основна URL-адреса, час очікування, формат типу вмісту, заголовки за замовчуванням, параметри та прив'язка запитів у URL-адресі та основні функції кешу.

Це приклад того, як його ініціалізувати, здійснити виклик та записати операцію у стилі curl :

var RequestClient = require("reqclient").RequestClient;
var client = new RequestClient({
    baseUrl:"http://baseurl.com/api/", debugRequest:true, debugResponse:true});
client.post("client/orders", {"client": 1234, "ref_id": "A987"},{"x-token": "AFF01XX"});

Це ввійде в консоль ...

[Requesting client/orders]-> -X POST http://baseurl.com/api/client/orders -d '{"client": 1234, "ref_id": "A987"}' -H '{"x-token": "AFF01XX"}' -H Content-Type:application/json

І коли відповідь буде повернута ...

[Response   client/orders]<- Status 200 - {"orderId": 1320934}

Це приклад того, як обробляти відповідь об'єктом обіцянки:

client.get("reports/clients")
  .then(function(response) {
    // Do something with the result
  }).catch(console.error);  // In case of error ...

Звичайно, він може бути встановлений з: npm install reqclient.


1

Ви можете використовувати curlrequest, щоб легко встановити час запиту, який ви хочете зробити ... Ви навіть можете встановити заголовки в опціях " підробляти " виклик браузера.


1

Попередження: Станом на 11 лютого 2020 року запит повністю застарілий.

Якщо ви реалізуєте за допомогою форм-даних, для отримання додаткової інформації ( https://tanaikech.github.io/2017/07/27/multipart-post-request-using-node.js ):

var fs = require('fs');
var request = require('request');
request.post({
  url: 'https://slack.com/api/files.upload',
  formData: {
    file: fs.createReadStream('sample.zip'),
    token: '### access token ###',
    filetype: 'zip',
    filename: 'samplefilename',
    channels: 'sample',
    title: 'sampletitle',
  },
}, function (error, response, body) {
  console.log(body);
});

0

Я знайшов суперагент дуже корисним, наприклад, дуже простим

const superagent=require('superagent')
superagent
.get('google.com')
.set('Authorization','Authorization object')
.set('Accept','application/json')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.