Promise based HTTP/HTTPS client with optional virtualization. Depends on request-promise. This is helpful for services / apis that call other services / apis, but want to allow for virtualizing (stubbing) those calls in tests, CI/CD pipeline, or volume / performance testing.
Install via npm as follows:
$ npm install vhttp --save
The most common usage is to pass a query or post param to your api indicating virtualization similar to:
http://hello.world.api/sayhello?virtual=notification
This could then be used in the service as follows:
varPromise=require('bluebird'),Vhttp=require('vhttp');Vhttp.register({notification: {slack1: {method: 'post',uri: 'http://api.slack.com/notify'},hipchat1: {method: 'post',uri: 'http://api.hipchat.com/notify'}});app.post('/sayhello',function(req,res){varvhttp=newVhttp(req.params.virtual);Promise.all([vhttp.post('http://api.slack.com/notify',{body: {message: 'Hello World!'},json: true}),vhttp.post('http://api.hipchat.com/notify',{body: {message: 'Hello World!'},json: true})]).then(function(results){res.status(200).send({slack: results[0],hipchat: results[1]});}).catch(function(err){res.status(500).send(err);});});For more details on bluebird's Promise.all, check this out.
Then in a folder called virtual the following files would be created:
project\
virtual\
slack1.request.json // contains: { "message": "Hello World!" }
slack1.response.json // contains: { "status": "ok" }
hipchat1.request.json // contains: { "message": "Hello Workd!" }
hipchat1.response.json // contains: { "status": "ok" }
Now when we call
http://hello.world.api/sayhello?virtual=notification
the response is
{
"slack": { "status": "ok" },
"hipchat": { "status": "ok" }
}For real (not virtualized) api calls just remove the virtual param
http://hello.world.api/sayhello