request-tools
Version:
基于nodejs的http和https请求工具类.
145 lines (131 loc) • 5.42 kB
JavaScript
/**
* Created by Bluesky on 2015/10/16.
* Description:基于http和https请求工具类
*/
;
var _url = require('url');
var http = require('http');
var https = require('https');
var bufferhelper = require('bufferhelper');
var utils = require("./utils");
var request_tools = module.exports = {};
request_tools.CONTENT_TYPES = {
"HTML": {NAME: 'HTML', CONTENT: 'text/html'},
"TEXT": {NAME: 'TEXT', CONTENT: 'text/plain'},
"XML": {NAME: 'XML', CONTENT: 'text/xml'},
"JSON": {NAME: 'JSON', CONTENT: 'application/json'},
"JPEG": {NAME: 'JPEG', CONTENT: 'image/jpeg'},
"FORM-URLENCODED": {NAME: 'FORM-URLENCODED', CONTENT: 'application/x-www-form-urlencoded'},
"ENCODE": '; charset=utf-8'
}
request_tools.request = function (url, callBack, params) {
params = params || {};
var body = params.body || '';
var method = params.method || 'GET';
var xmlRoot = params.xmlRoot || 'xml';
var httpType = params.httpType || 'http';
var send_xml_root = params.send_xml_root || 'xml';
var responseFormat = params.responseFormat || 'json';
var authorization = params.authorization || '';
var contentType = params.contentType && params.contentType.NAME || '';
var urlObj = _url.parse(url) || {};
var opts = {host: urlObj.hostname, method: method};
if (urlObj.path && urlObj.path.length > 0) {
opts.path = urlObj.path;
}
if (urlObj.port && urlObj.port.length > 0) {
opts.port = urlObj.port;
}
var _contentType = request_tools.CONTENT_TYPES[contentType];
if (!_contentType) {
console.log('暂不支持该类型:' + contentType);
return;
}
opts.headers = {'Content-Type': _contentType.CONTENT};
if (contentType != request_tools.CONTENT_TYPES.JPEG.NAME
&& contentType != request_tools.CONTENT_TYPES['FORM-URLENCODED'].NAME) {
opts.headers['Content-Type'] = opts.headers['Content-Type']
+ request_tools.CONTENT_TYPES.ENCODE;
}
if (body) {
if (contentType == request_tools.CONTENT_TYPES['FORM-URLENCODED'].NAME) {
opts.headers['Content-Length'] = body.length;
} else if (typeof body === 'object'
&& contentType === request_tools.CONTENT_TYPES.XML.NAME) {
body = utils.obj2Xml(body, send_xml_root)
} else if (typeof body === 'object'
&& contentType === request_tools.CONTENT_TYPES.JSON.NAME) {
body = JSON.stringify(body)
}
}
if (authorization) {
opts.headers['Authorization'] = authorization;
}
try {
var reqHttp = (httpType == 'https' ? https : http);
if (httpType == 'https') {
if (params.rejectUnauthorized) {
opts.rejectUnauthorized = true;
if (params.ca) {
opts.ca = params.ca;
opts.agent = new https.Agent(opts);
}
} else {
// 默认https 忽略证书验证
opts.rejectUnauthorized = false;
}
}
var req = reqHttp.request(opts, function (res) {
var buffer_helper = new bufferhelper();
res.on('data', function (chunk) {
buffer_helper.concat(chunk);
});
res.on('end', function () {
var data = buffer_helper.toBuffer().toString();
var contentType = res.headers['content-type'];
if (!contentType) {
contentType = params.resContentType || 'text/html; charset=utf-8';
}
contentType = contentType.split(';')[0];
if (contentType == request_tools.CONTENT_TYPES.JPEG.CONTENT) {
callBack(null, data);//大数据要分次发
return;
}
var data = new Buffer(data, 'utf8').toString('utf8');
if ((responseFormat && responseFormat === 'JSON')
|| contentType == request_tools.CONTENT_TYPES.JSON.CONTENT) {
try {
var jsonObj = JSON.parse(data);
callBack(null, jsonObj);
} catch (e) {
callBack(null, data);
}
} else if ((responseFormat && responseFormat === 'XML')
|| contentType == request_tools.CONTENT_TYPES.XML.CONTENT) {
utils.xml2Obj(data, xmlRoot, callBack);
} else if ((responseFormat && responseFormat === 'HTML')
|| contentType == request_tools.CONTENT_TYPES.HTML.CONTENT) {
callBack(null, data);
} else if ((responseFormat && responseFormat === 'TEXT')
|| contentType == request_tools.CONTENT_TYPES.TEXT.CONTENT) {
callBack(null, data);
}
else {
callBack(new Error('http请求返回Content-Type错误:' + res.req.path + ',Content-Type:' + contentType));
}
});
res.on('error', function (err) {
callBack(err);
});
});
req.on('error', function (err) {
callBack(err);
});
if (body) {
req.write(body);
}
req.end();
} catch (e) {
callBack(e);
}
}