一个精简的HTTP网络模块,可以进行POST或GET请求,可以指定请求头,兼容性很好
var http = {};
module.exports = http;
var stringifyQueryString = function (params) {
var qs = '';
for (var i in params) {
if (params[i] !== undefined) {
if (typeof params[i] === 'string') {
qs += '&' + i + '=' + encodeURIComponent(params[i]);
} else {
qs += '&' + i + '=' + encodeURIComponent(JSON.stringify(params[i]));
}
}
}
return qs.slice(1);
};
/**
* @param {url:string, data:any, tamethod:'post'|'get', timeout:number, headers:object} option
*/
http.quest = function (option, callback) {
// 请求类型
var method = option.method || 'GET';
// 超时时间
var timeout = option.timeout || 5000;
// 请求头
var headers = option.headers || { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" }; // application/json text/plain
// 请求网址和数据
var url = '';
var data = null;
if (method === 'post' || method === 'POST') {
url = option.url;
data = option.data;
} else if (option.data) {
url = option.url + '?' + stringifyQueryString(option.data);
} else {
url = option.url;
}
// 请求实例
var xhr = new XMLHttpRequest();
xhr.open(method.toLocaleLowerCase(), url, true);
// 设置请求头
for (var key in headers) { xhr.setRequestHeader(key, headers[key]) }
// 设置超时时间
(timeout > 0) && (xhr.timeout = timeout);
// 发送请求
xhr.send(((data !== null && typeof data === 'object') || typeof data === 'number' || typeof data === 'boolean') ? JSON.stringify(data) : data);
// 请求返回
xhr.onreadystatechange = () => {
if (xhr.readyState == 4) {
if (xhr.status >= 200 && xhr.status < 400) {
var result = xhr.responseText;
try { result = JSON.parse(xhr.responseText); } catch (e) { }
callback && callback(null, result);
} else {
callback && callback('status: ' + xhr.status);
}
callback = null;
}
};
xhr.ontimeout = function () {
if (callback) {
callback('timeout');
callback = null;
console.log('[sdk] %c连%c接%c超%c时 %s', 'color:red', 'color:orange', 'color:purple', 'color:green', url);
}
};
xhr.onerror = function () {
if (callback) {
callback('error');
callback = null;
console.log('[sdk] %c连%c接%c失%c败 %s', 'color:red', 'color:orange', 'color:purple', 'color:green', url);
}
};
xhr.onabort = function () {
if (callback) {
callback('abort');
callback = null;
console.log('[sdk] %c连%c接%c终%c止 %s', 'color:red', 'color:orange', 'color:purple', 'color:green', url);
}
};
if (timeout) {
setTimeout(() => {
if (callback) {
xhr.ontimeout();
xhr.abort();
}
}, timeout);
}
};
/**
* http.get('login?code=asdi1239028sadadhjk213h',function(){})
* http.get({url:'login',data:{code:'asdi1239028sadadhjk213h'}},function(){})
*
*/
http.get = function (url, callback, verification) {
var option = url.url ? url : { url: url };
option.method = 'get';
this.quest(option, function (err, res) {
if (!err && verification) {
err = verification(res);
}
callback && callback(err, res);
});
};
/**
* http.post('login',function(){})
* http.post({url:'login',data:{code:'asdi1239028sadadhjk213h'}},function(){})
*/
http.post = function (url, callback, verification) {
var option = url.url ? url : { url: url };
option.method = 'post';
this.quest(option, function (err, res) {
if (!err && verification) {
err = verification(res);
}
callback && callback(err, res);
});
};
