web-dev-qa-db-fra.com

Comment faire un appel distant REST à l'intérieur de Node.js? un CURL?

Dans Node.js , autre que l'utilisation d'un processus enfant pour créer CURL appel, existe-t-il un moyen de faire un appel CURL au serveur distant RESTE API et récupère les données de retour?

J'ai également besoin de configurer l'en-tête de demande pour l'appel distant RESTE, ainsi que la chaîne de requête également dans GET (ou POST).

Je trouve celui-ci: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

mais il ne montre aucun moyen de POST chaîne de requête.

172
murvinlai

Regardez 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();
_
205
Raynos

Pourquoi ne pas utiliser Demande - Client HTTP simplifié .

Voici un 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 voulait aussi un POST:

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

Regardez 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);
});
34
Giulio Roggero

J'utilise node-fetch car il utilise le familier (si vous êtes un développeur Web) API fetch () . fetch () est le nouveau moyen de faire des requêtes HTTP arbitraires à partir du navigateur.

Oui, je sais que c’est une question de nœud js, mais ne souhaitons-nous pas réduire le nombre de développeurs que l’API doit mémoriser et comprendre et améliorer la réutilisation de notre code javascript? Fetch est un standard alors pourquoi ne pas y converger?

L'autre bonne chose à propos de fetch (), c'est qu'il renvoie un javascript Promise , vous pouvez donc écrire du code asynchrone comme ceci:

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

La recherche remplace XMLHTTPRequest . Voici quelques plus d'infos .

28
saille

J'utilise catcheur pour faire appel à des services Web, fonctionne comme un charme et est très soigné.

11
swapnil_mishra

n autre exemple - vous devez installer le module de requête pour cela

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
Hardik Ranpariya

Pour utiliser les dernières fonctionnalités Async/Await

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

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

//code

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
codemirror

Je n'en ai trouvé aucun avec cURL alors j'ai écrit un wrapper autour de node-libcurl et peut être trouvé à https://www.npmjs.com/package/vps-rest-client .

Pour créer un POST, procédez comme suit:

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));
3
Jonatas Walker

Axios

Un exemple (axios_example.js) utilisant Axios dans 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);

Assurez-vous que dans votre répertoire de projet vous faites:

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

Vous pouvez ensuite tester l'API Node.js REST à l'aide de votre navigateur à l'adresse: http://localhost:5000/search?queryStr=xxxxxxxxx.

De même, vous pouvez faire un post, tel que:

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

SuperAgent

De même, vous pouvez utiliser SuperAgent.

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

Et si vous voulez faire une authentification de base:

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:

3
Yuci
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
Seb

Si vous avez Node.js 4.4+, jetez un oeil à reqclient , il vous permet de passer des appels et de consigner les demandes dans le style cURL, de sorte que vous pouvez facilement vérifier et reproduire les appels en dehors de l'application.

Retourne Promise objets au lieu de passer des rappels simples, afin que vous puissiez gérer le résultat plus "fashion", chaîne le résultat facilement, et gérer les erreurs de manière standard. Supprime également de nombreuses configurations standard sur chaque demande: URL de base, délai d'expiration, format du type de contenu, en-têtes par défaut, paramètres et liaison de requête dans l'URL, ainsi que les fonctionnalités de cache de base.

Voici un exemple montrant comment l'initialiser, passer un appel et consigner l'opération avec le style 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"});

Cela va se connecter à la console ...

[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

Et quand la réponse est retournée ...

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

Voici un exemple de traitement de la réponse avec l'objet de promesse:

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

Bien sûr, il peut être installé avec: npm install reqclient.

2
Mariano Ruiz

Vous pouvez utiliser curlrequest pour définir facilement l’heure de la requête que vous souhaitez effectuer ... vous pouvez même définir les en-têtes dans les options sur " fake "un appel du navigateur.

1
luizpanariello

Si vous implémentez avec des données de formulaire, pour plus d'informations ( 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
Lwf804