How to make remote REST call inside Node.js? any CURL?

462,057

Solution 1

Look at 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();

Solution 2

How about using Request — Simplified HTTP client.

Edit February 2020: Request has been deprecated so you probably shouldn't use it any more.

Here's a 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.
     }
})

OP also wanted a POST:

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

Solution 3

I use node-fetch because it uses the familiar (if you are a web developer) fetch() API. fetch() is the new way to make arbitrary HTTP requests from the browser.

Yes I know this is a node js question, but don't we want to reduce the number of API's developers have to memorize and understand, and improve re-useability of our javascript code? Fetch is a standard so how about we converge on that?

The other nice thing about fetch() is that it returns a javascript Promise, so you can write async code like this:

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

Fetch superseeds XMLHTTPRequest. Here's some more info.

Solution 4

Look at 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);
});

Solution 5

Axios

An example (axios_example.js) using Axios in 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);

Be sure in your project directory you do:

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

You can then test the Node.js REST API using your browser at: http://localhost:5000/search?queryStr=xxxxxxxxx

Similarly you can do post, such as:

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

SuperAgent

Similarly you can use SuperAgent.

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

And if you want to do basic authentication:

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

Ref:

Share:
462,057

Related videos on Youtube

murvinlai
Author by

murvinlai

Updated on August 22, 2021

Comments

  • murvinlai
    murvinlai over 2 years

    In Node.js, other than using child process to make CURL call, is there a way to make CURL call to remote server REST API and get the return data?

    I also need to set up the request header to the remote REST call, and also query string as well in GET (or POST).

    I find this one: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

    but it doesn't show any way to POST query string.

  • murvinlai
    murvinlai about 13 years
    So, even it is POST, I also append data in the query string?
  • Raynos
    Raynos about 13 years
    @murvinlai not sure. Go read the docs, source, HTTP spec. Not an expert on that region.
  • weisjohn
    weisjohn almost 12 years
    Version 6.18 docs : nodejs.org/docs/v0.6.18/api/…
  • peter
    peter about 11 years
    How do i access the values from d??? d = {"data":[{"id":1111,"name":"peter"}]} . how to get name value?
  • peter
    peter about 11 years
    managed to get values by using var thed = JSON.parse(d); console.log("the id is : "+thed.data[0].id); But some time i get "Unexpected end of input"
  • binarygiant
    binarygiant about 11 years
    One thing to note is that you don't put http or https in your host entry e.g. var options = { host: graph.facebook.com .... } not {host: http: graph.facebook.com }. That tripped me up for a few cycles. (See below). These are both great answers. Thanks to you both.
  • Xerri
    Xerri about 11 years
    Can I just point out that if the reply is long, using res.on('data',..) is not enough. I believe the correct way is to also have res.on('end'..) to know when you have received all the data. Then you can process.
  • Rama
    Rama over 7 years
    This is a very old answer - for those writing node js today you'd surely use npmjs.com/package/node-fetch or other fetch API based package, which is based on the Fetch standard. See my answer below.
  • Dynamic Remo
    Dynamic Remo almost 7 years
    Works fine with google.com but returning "RequestError: Error: socket hang up" when requesting facebook's graph api. Please guide, thanks!
  • user3072843
    user3072843 over 6 years
    Could you mention how you called the http module? require('WHAT?')
  • Pratik Singhal
    Pratik Singhal over 6 years
    This module contains a lot of issues!
  • CodeMad
    CodeMad over 6 years
    @user3072843, it's there in the link mentioned. require('node-fetch');
  • vdenotaris
    vdenotaris about 6 years
    How can I pass a request parameter while consuming a REST API in this way?
  • Sebastian
    Sebastian over 5 years
    problem with node-fetch when writting APIs is that only works will full URL and will not work with relative URLs.
  • Sadiel
    Sadiel about 4 years
    As of Feb 11th 2020, request is fully DEPRECATED. You can see it in the website github.com/request/request#deprecated
  • Steve3p0
    Steve3p0 about 4 years
    Any guidance on what newbies should use? I am filtering thru a LOT of examples that use this.
  • Steve3p0
    Steve3p0 about 4 years
    This provides some guidance: github.com/request/request/issues/3143
  • Rama
    Rama about 2 years
    Note: fetch() is coming to the core NodeJS runtime as of v17.5 fusebit.io/blog/node-fetch