Simplicity to create multiple HTTP Request in Parallel for NodeJS
npm install parallel-http-requestbash
$ npm install parallel-http-request
`Usage
$3
`javascript
var ParallelRequest = require('parallel-http-request');var config = {
response: "simple" // [optional] detail|simple|unirest, if empty then the response output is simple
};
var request = new ParallelRequest(config);
//or without config
var request = new ParallelRequest();
`
The config.response options value is :
- simple : minimalist output response.
- detail : output response very detail.
- unirest : output response with unirest format.$3
`javascript
request.add('https://jsonplaceholder.typicode.com/posts/1')
.add('https://jsonplaceholder.typicode.com/posts/2')
.send(function(response){
console.log(response);
});// or
request.add({url:'https://jsonplaceholder.typicode.com/posts/1',method:'get'})
.add({url:'https://jsonplaceholder.typicode.com/posts/2',method:'get'})
.send(function(response){
console.log(response);
});
// or mixed it
request.add({
url:'https://jsonplaceholder.typicode.com/posts/1',
method:'get'
})
.add({
url:'https://jsonplaceholder.typicode.com/posts/2',
method:'post',
headers:{'Content-Type':'application/json'},
body: {
fullname:'value',
address:'value'
}
})
.add({
url:'https://jsonplaceholder.typicode.com/posts/3',
method:'delete',
headers:{'Content-Type':'application/json'},
body: {
fullname:'value',
address:'value'
}
})
.send(function(response){
console.log(response);
});
`Documentation
This Parallel HTTP Request is created based on unirest-nodejs library, so request.options is almost similar with unirest. Note:
- This library is intended to create multiple request in parallel, so not all
unirest feature is worked. Please see Limitation.$3
To make a multiple http request, you have to use .add() for each request.
request.add(string|object) this will add your request into collection. -
request.add(string) this request will use default method GET.
- request.add(object) this request will use object options.$3
This will execute your multiple request.
Return output is always array object.
`javascript
request.send(function(response){
console.log(response)
});
`$3
- url: (String) - Url to send the request.
- method: (String) - Default GET; HTTP Method.
- headers: (Object) - Default {}; HTTP Headers.
- query: (Object) - HTTP URI Parameter.
- body: (String | Object) - Entity body for certain requests.
- form: (Object) - Form Data.
- field: (Object) - Form fields.
- attach: (Object) - For handle files.
- followRedirect: (Boolean) - Default true; Follow HTTP 3xx responses as redirects.
- followAllRedirects: (Boolean) - Default false; Follow Non-GET HTTP 3xx responses as redirects.
- maxRedirects: (Number) - Default 10; Maximum number of redirects before aborting.
- timeout: (Number) - Number of milliseconds to wait before aborting.
- encoding: (String) - Encoding to be used on setEncoding of response data.
- strictSSL: (Boolean) - Default true; Sets strictSSL flag to require that SSL certificates be valid.
- httpSignature: (Object) - HTTP Signature.
- proxy: (String) - HTTP Proxy.
- secureProtocol: (Object) - Sets the secure protocol to use.
- localAddress: (Object) - Sets localAddress, local interface to bind for network connections.
- auth: (Object) - Accepts either an Object containing user, pass, and optionally sendImmediately.
- aws: (Object) - Sets aws, AWS Signing Credentials.
- hawk: (Object) - Sets hawk, HAWK Signing Credentials.
- cookie: (String) - Creates a cookie.$3
This will remove url in collection.
- name is the url of the request.
`javascript
request.remove('http://google.com');
`$3
This will cleanup all request in collection.
`javascript
request.clean();
`$3
This will return all request in collection.
`javascript
request.getCollection();
`$3
If you want to use unirest (the underlying layer of parallel-http-request) directly.
Because Sometimes we are not always have to call request in parallel.
Please see Unirest Documentation.`javascript
request.unirest.get('http://google.com')
.end(function(response){
console.log(response.body)
});
`$3
#### Request with Method
You can just set method request by like this
`javascript
request.add({url:'https://www.google.com', method:'get'});
request.add({url:'https://www.google.com', method:'post'});
request.add({url:'https://www.google.com', method:'put'});
request.add({url:'https://www.google.com', method:'patch'});
request.add({url:'https://www.google.com', method:'delete'});
request.add({url:'https://www.google.com', method:'head'});
request.add({url:'https://www.google.com', method:'options'});
`#### Request with Query / Body / Form
##### POST with Query Parameter
`javascript
request.add({
url:'https://jsonplaceholder.typicode.com/posts/1',
method:'post',
query: {
search:'value'
}
});
`##### POST with Body
`javascript
request.add({
url:'https://jsonplaceholder.typicode.com/posts/1',
method:'post',
headers:{'Content-Type':'application/json'}
body: {
fullname:'value',
address:'value'
}
});
`##### POST with Form Data Encoded
`javascript
request.add({
url:'https://jsonplaceholder.typicode.com/posts/1',
method:'post',
headers:{'Content-Type':'application/x-www-form-urlencoded'}
form: {
fullname:'value',
address:'value'
}
})
.add({
url:'https://jsonplaceholder.typicode.com/posts/2',
method:'post',
headers:{'Content-Type':'application/x-www-form-urlencoded'}
body: JSON.stringify({
fullname:'value',
address:'value'
})
})
.add({
url:'https://jsonplaceholder.typicode.com/posts/3',
method:'post',
headers:{'Content-Type':'application/x-www-form-urlencoded'}
body: 'name=nijiko&pet=turtle'
});
`##### POST with Body HTML / Other
`javascript
request.add({
url:'https://jsonplaceholder.typicode.com/posts/1',
method:'post',
headers:{'Content-Type':'text/html'}
body: 'Hello World!'
});
`#### Request with Upload File
`javascript
request.add({
url:'http://mockbin.com/request',
method:'post',
headers:{
'Content-Type': 'multipart/form-data',
'Content-Length': fs.statSync(path.resolve('favicon.ico')).size
},
attach:{
'file':fs.createReadStream(path.resolve('favicon.ico')),
'remote file':request.unirest.request('http://google.com/favicon.ico')
}
});
`#### Request with timeout
`javascript
request.add({
url:'http://www.google.com',
timeout:60000
});
`#### Request with encoding
`javascript
request.add({
url:'http://www.google.com',
encoding:'utf-8'
});
`#### Request with followRedirect
`javascript
request.add({
url:'http://www.google.com',
followRedirect:true
});
`#### Request with maxRedirects
`javascript
request.add({
url:'http://www.google.com',
maxRedirects:5
});
`#### Request with strictSSL
`javascript
request.add({
url:'https://www.google.com',
strictSSL:false
});
`#### Request with proxy
`javascript
request.add({
url:'http://www.google.com',
proxy:'http://localproxy.com'
});
`#### Request with secureProtocol
`javascript
request.add({
url:'https://www.google.com',
secureProtocol:'SSLv3_client_method'
});
`#### Request with localAddress
`javascript
request.add({
url:'http://www.google.com',
localAddress:'127.0.0.1'
});
`#### Request with auth
`javascript
request.add({
url:'http://www.google.com',
auth:{
user: 'Nijiko',
pass: 'insecure',
sendImmediately: true
}
});
`#### Request with aws
`javascript
request.add({
url:'http://www.google.com',
aws:{
key: 'AWS_S3_KEY',
secret: 'AWS_S3_SECRET',
bucket: 'BUCKET NAME'
}
});
`#### Request with hawk
`javascript
request.add({
url:'http://www.google.com',
hawk:{
credentials: {
key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
algorithm: 'sha256',
user: 'Steve'
}
}
});
`#### Request with cookie
Create request with
cookie. Please see documentation.
`javascript
request.add({
url:'http://www.google.com',
cookie:'yummy_cookie=choco; tasty_cookie=strawberry'
});
`#### Request with Jar
Creates a container to store multiple cookies, i.e. a cookie jar.
`javascript
var cookieJar = request.jar;
cookieJar.add(request.cookie('yummy_cookie=choco; tasty_cookie=strawberry'));
// or as argument
cookieJar.add('key=value', '/');request.add({
url:'http://google.com',
jar:cookieJar
});
`Limitation
There is several feature which is not posible to do with multiple parallel request.-
oauth - Sets oauth, list of oauth credentials.
- part - Still Experimental; Similiar to request multipart.
- then - promise function.
- pool - Single request; for socket connection which is use for single connection.
- forever - Keeps socket connections alive between keep-alive in requests.The solution about this limitation is you have to directly use
unirest libary.$3
#### Request with oAuth
`javascript
request.unirest
.get('https://api.twitter.com/oauth/request_token')
.oauth({
callback: 'http://mysite.com/callback/',
consumer_key: 'CONSUMER_KEY',
consumer_secret: 'CONSUMER_SECRET'
})
.then(response => {
let access_token = response.body
return request.unirest
.post('https://api.twitter.com/oauth/access_token')
.oauth({
consumer_key: 'CONSUMER_KEY',
consumer_secret: 'CONSUMER_SECRET',
token: access_token.oauth_token,
verifier: token: access_token.oauth_verifier
})
})
.then((response) => {
var token = response.body
return request.unirest
.get('https://api.twitter.com/1/users/show.json')
.oauth({
consumer_key: 'CONSUMER_KEY',
consumer_secret: 'CONSUMER_SECRET',
token: token.oauth_token,
token_secret: token.oauth_token_secret
})
.query({
screen_name: token.screen_name,
user_id: token.user_id
})
})
.then((response) => {
console.log(response.body)
});
`
Please see Unirest Documentation.
Unit Test
`bash
$ npm test
``