HTTP GET Request in Node.js Express
如何从Node.js或Express.js中发出HTTP请求? 我需要连接到另一个服务。 我希望调用是异步的,并且回调包含远程服务器的响应。
以下是我的样本中的一些代码片段。它是异步的并返回一个JSON对象。它可以做任何形式的GET请求。
请注意,有更多的最佳方式(只是一个示例) - 例如,而不是连接您放入数组并加入它的块等...希望它能让您从正确的方向开始:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | const http = require('http'); const https = require('https'); /** * getJSON: RESTful GET request returning JSON object(s) * @param options: http options object * @param callback: callback to pass the results JSON object(s) back */ module.exports.getJSON = (options, onResult) => { console.log('rest::getJSON'); const port = options.port == 443 ? https : http; let output = ''; const req = port.request(options, (res) => { console.log(`${options.host} : ${res.statusCode}`); res.setEncoding('utf8'); res.on('data', (chunk) => { output += chunk; }); res.on('end', () => { let obj = JSON.parse(output); onResult(res.statusCode, obj); }); }); req.on('error', (err) => { // res.send('error: ' + err.message); }); req.end(); }; |
它通过创建一个选项对象来调用,如:
1 2 3 4 5 6 7 8 9 | const options = { host: 'somesite.com', port: 443, path: '/some/path', method: 'GET', headers: { 'Content-Type': 'application/json' } }; |
并提供回调函数。
例如,在服务中,我需要上面的REST模块,然后执行以下操作:
1 2 3 4 5 6 7 8 9 10 | rest.getJSON(options, (statusCode, result) => { // I could work with the resulting HTML/JSON here. I could also just return it console.log(`onResult: (${statusCode}) ${JSON.stringify(result)}`); res.statusCode = statusCode; res.send(result); }); |
UPDATE
如果你正在寻找
Microsoft typed-rest-client
尝试在node.js中使用简单的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | var http = require('http'); var options = { host: 'www.google.com', path: '/index.html' }; var req = http.get(options, function(res) { console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); // Buffer the body entirely for processing as a whole. var bodyChunks = []; res.on('data', function(chunk) { // You can process streamed parts here... bodyChunks.push(chunk); }).on('end', function() { var body = Buffer.concat(bodyChunks); console.log('BODY: ' + body); // ...and/or process the entire body here. }) }); req.on('error', function(e) { console.log('ERROR: ' + e.message); }); |
还有一个通用的
Request和Superagent是非常好的库。
使用
1 2 3 4 5 6 7 | var request=require('request'); request.get('https://someplace',options,function(err,res,body){ if(err) //TODO: handle err if(res.statusCode !== 200 ) //etc //TODO Do something with response }); |
您还可以使用Requestify,这是我为nodeJS +编写的非常酷且非常简单的HTTP客户端,它支持缓存。
只需对GET方法请求执行以下操作:
1 2 3 4 5 6 7 8 | var requestify = require('requestify'); requestify.get('http://example.com/api/resource') .then(function(response) { // Get the response body (JSON parsed or jQuery object for XMLs) response.getBody(); } ); |
此版本基于最初由bryanmac函数提出,该函数使用promises,更好的错误处理,并在ES6中重写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | let http = require("http"), https = require("https"); /** * getJSON: REST get request returning JSON object(s) * @param options: http options object */ exports.getJSON = function(options) { console.log('rest::getJSON'); let reqHandler = +options.port === 443 ? https : http; return new Promise((resolve, reject) => { let req = reqHandler.request(options, (res) => { let output = ''; console.log('rest::', options.host + ':' + res.statusCode); res.setEncoding('utf8'); res.on('data', function (chunk) { output += chunk; }); res.on('end', () => { try { let obj = JSON.parse(output); // console.log('rest::', obj); resolve({ statusCode: res.statusCode, data: obj }); } catch(err) { console.error('rest::end', err); reject(err); } }); }); req.on('error', (err) => { console.error('rest::request', err); reject(err); }); req.end(); }); }; |
因此,您不必传入回调函数,而是getJSON()返回一个promise。在以下示例中,该函数在ExpressJS路由处理程序中使用
1 2 3 4 5 6 7 8 9 10 11 | router.get('/:id', (req, res, next) => { rest.getJSON({ host: host, path: `/posts/${req.params.id}`, method: 'GET' }).then(({status, data}) => { res.json(data); }, (error) => { next(error); }); }); |
出错时,它将错误委托给服务器错误处理中间件。
Unirest是我从Node发出HTTP请求时遇到的最好的库。它的目标是成为一个多平台框架,因此如果您需要在Ruby,PHP,Java,Python,Objective C,.Net或Windows 8上使用HTTP客户端,那么了解它如何在Node上工作将很有用。据我所知,unirest库主要由现有的HTTP客户端支持(例如在Java,Apache HTTP客户端,Node上,Mike的请求库) - Unirest只是将更好的API放在首位。
以下是Node.js的几个代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | var unirest = require('unirest') // GET a resource unirest.get('http://httpbin.org/get') .query({'foo': 'bar'}) .query({'stack': 'overflow'}) .end(function(res) { if (res.error) { console.log('GET error', res.error) } else { console.log('GET response', res.body) } }) // POST a form with an attached file unirest.post('http://httpbin.org/post') .field('foo', 'bar') .field('stack', 'overflow') .attach('myfile', 'examples.js') .end(function(res) { if (res.error) { console.log('POST error', res.error) } else { console.log('POST response', res.body) } }) |
您可以在此处直接跳转到Node文档
看看httpreq:这是我创建的节点库,因为我很沮丧,那里没有简单的http GET或POST模块;-)
看看碎片。它是由spire.io创建和维护的节点HTTP客户端,用于处理重定向,会话和JSON响应。它非常适合与其他API交互。有关详细信息,请参阅此博客文章。
如果您只需要发出简单的get请求而不需要支持任何其他HTTP方法,请查看:simple-get:
1 2 3 4 5 6 7 | var get = require('simple-get'); get('http://example.com', function (err, res) { if (err) throw err; console.log(res.statusCode); // 200 res.pipe(process.stdout); // `res` is a stream }); |
使用reqclient:不是为脚本目的而设计的
像
指定许多配置,当您需要重用相同的配置时
一次又一次配置:基本URL,标题,auth选项,
日志选项,缓存等。还有一些有用的功能
查询和URL解析,自动查询编码和JSON解析等。
使用库的最佳方法是创建一个模块来导出对象
指向API和连接的必要配置:
模块
1 2 3 4 5 6 7 8 9 | let RequestClient = require("reqclient").RequestClient let client = new RequestClient({ baseUrl:"https://myapp.com/api/v1", cache: true, auth: {user:"admin", pass:"secret"} }) module.exports = client |
在需要使用API??的控制器中使用如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | let client = require('client') //let router = ... router.get('/dashboard', (req, res) => { // Simple GET with Promise handling to https://myapp.com/api/v1/reports/clients client.get("reports/clients") .then(response => { console.log("Report for client", response.userId) // REST responses are parsed as JSON objects res.render('clients/dashboard', {title: 'Customer Report', report: response}) }) .catch(err => { console.error("Ups!", err) res.status(400).render('error', {error: err}) }) }) router.get('/orders', (req, res, next) => { // GET with query (https://myapp.com/api/v1/orders?state=open&limit=10) client.get({"uri":"orders","query": {"state":"open","limit": 10}}) .then(orders => { res.render('clients/orders', {title: 'Customer Orders', orders: orders}) }) .catch(err => someErrorHandler(req, res, next)) }) router.delete('/orders', (req, res, next) => { // DELETE with params (https://myapp.com/api/v1/orders/1234/A987) client.delete({ "uri":"orders/{client}/{id}", "params": {"client":"A987","id": 1234} }) .then(resp => res.status(204)) .catch(err => someErrorHandler(req, res, next)) }) |
库:OAuth2集成和记录器集成
使用cURL语法,并始终返回本机Promise对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | ## you can use request module and promise in express to make any request ## const promise = require('promise'); const requestModule = require('request'); const curlRequest =(requestOption) =>{ return new Promise((resolve, reject)=> { requestModule(requestOption, (error, response, body) => { try { if (error) { throw error; } if (body) { try { body = (body) ? JSON.parse(body) : body; resolve(body); }catch(error){ resolve(body); } } else { throw new Error('something wrong'); } } catch (error) { reject(error); } }) }) }; const option = { url : uri, method :"GET", headers : { } }; curlRequest(option).then((data)=>{ }).catch((err)=>{ }) |