Come rendere la chiamata REST remota all’interno di Node.js? qualsiasi CURL?

In Node.js , oltre all’utilizzo del processo secondario per effettuare chiamate CURL , esiste un modo per effettuare chiamate CURL all’API REST del server remoto e ottenere i dati di ritorno?

Devo anche impostare l’intestazione della richiesta per la chiamata REST remota e anche interrogare la stringa anche in GET (o POST).

Trovo questo: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

ma non mostra alcun modo di stringa di query POST.

Guarda 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(); 

Che ne dici di usare Request – Client HTTP semplificato .

Ecco 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 voleva anche un POST:

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

Guarda 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://sofit.miximages.com/rest/www.youscada.com", "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); }); 

Io uso node-fetch perché usa l’ API familiare (se sei un sviluppatore web) fetch () . fetch () è il nuovo modo di effettuare richieste HTTP arbitrarie dal browser.

Sì, so che questa è una domanda di nodo js, ​​ma non vogliamo ridurre il numero di sviluppatori API che devono memorizzare e comprendere e migliorare la riutilizzabilità del nostro codice javascript? Fetch è uno standard, quindi per quanto riguarda la convergenza?

L’altra cosa bella di fetch () è che restituisce un javascript Promise , quindi puoi scrivere un codice asincrono come questo:

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

Il recupero sostituisce XMLHTTPRequest . Ecco alcune informazioni in più .

Ho usato il restler per effettuare chiamate sui servizi web , funziona come un incantesimo ed è abbastanza pulito.

un altro esempio: è necessario installare il modulo di richiesta per quello

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

Non ho trovato nessuno con cURL, quindi ho scritto un wrapper su node-libcurl e posso trovarlo su https://www.npmjs.com/package/vps-rest-client .

Per fare un POST è così:

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

Se hai Node.js 4.4+, dai un’occhiata a reqclient , ti permette di effettuare chiamate e registrare le richieste in stile cURL , così puoi facilmente controllare e riprodurre le chiamate al di fuori dell’applicazione.

Restituisce gli oggetti Promise invece di passare semplici callback, in modo da poter gestire il risultato in un modo più “fashion” , associare facilmente il risultato e gestire gli errori in modo standard. Rimuove anche molte configurazioni standard per ogni richiesta: URL di base, timeout, formato del tipo di contenuto, intestazioni predefinite, parametri e binding di query nell’URL e funzioni di base della cache.

Questo è un esempio di come inizializzarlo, effettuare una chiamata e registrare l’operazione con lo stile di arricciatura :

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

Questo accederà alla 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 

E quando la risposta viene restituita …

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

Questo è un esempio di come gestire la risposta con l'object promise:

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

Naturalmente, può essere installato con: npm install reqclient .

Axios

Un esempio (axios_example.js) che utilizza 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); 

Assicurati che nella directory del tuo progetto tu faccia:

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

È quindi ansible testare l’API REST Node.js utilizzando il browser all’indirizzo: http://localhost:5000/search?queryStr=xxxxxxxxx

Allo stesso modo puoi pubblicare post, come ad esempio:

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

SuperAgent

Allo stesso modo è ansible utilizzare SuperAgent.

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

E se vuoi fare l’autenticazione di 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)); }); 

Rif:

Puoi usare curlrequest per impostare facilmente l’ora della richiesta che vuoi fare … puoi anche impostare le intestazioni nelle opzioni per ” falsificare ” una chiamata browser.