如何在Node.js中进行远程REST调用? 任何CURL?

Node.js中 ,除了使用subprocess进行CURL调用之外,是否有一种方法可以对远程服务器REST API进行CURL调用并获取返回数据?

我还需要设置远程REST调用的请求头,以及GET(或POST)中的查询string。

我find了这个: http : //blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

但是它不会以任何方式显示POST查询string。

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

如何使用请求 – 简化的HTTP客户端 。

这里是一个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还想要一个POST:

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

看看http://isolaso​​ftware.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); }); 

我使用node-fetch,因为它使用了熟悉的(如果你是一个web开发者) fetch()API 。 fetch()是从浏览器进行任意HTTP请求的新方法。

是的,我知道这是一个js节点的问题,但是我们是不是想减lessAPI的开发人员必须记住和理解的数量,并提高我们的javascript代码的可重用性? Fetch是一个标准,那么我们如何融合呢?

fetch()的另一个好处是它返回一个javascript Promise ,所以你可以编写像这样的asynchronous代码:

 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 。 这里有一些更多的信息 。

我一直在使用restler进行web服务调用,作品像魅力,非常整齐。

另一个例子 – 你需要为此安装请求模块

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

我没有find任何与curl,所以我写了一个包装节点libcurl ,可以在https://www.npmjs.com/package/vps-rest-clientfind。;

做一个POST是这样的:

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

您可以使用curlrequest来轻松设置您要执行的请求的时间…您甚至可以在选项中设置标题来“ 伪造 ”浏览器调用。

如果你有Node.js 4.4+,看一下reqclient ,它允许你拨打电话并以cURL风格logging请求,这样你就可以轻松地在应用程序之外检查和再现呼叫。

返回Promise对象而不是传递简单的callback,所以你可以以更“时尚”的方式处理结果,轻松地链接结果,并以标准方式处理错误。 每个请求还删除了大量的样板configuration:基本URL,超时,内容types格式,默认标题,URL中的参数和查询绑定以及基本cachingfunction。

这是如何初始化它的一个例子,打个电话,并用curl风格logging操作:

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

这将login控制台…

 [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} 

这是一个如何处理promise对象的响应的例子:

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

当然,它可以安装: npm install reqclient