js请求结果拦截机器_http.js(简化ajax api设计并为请求增加拦截过滤器)

/**

* @author Longbo Ma*/(function($) {var _Http ={},

globalData= {}, //全局数据,请求时会发送

interceptors = [] //全局拦截器;

/**

* 合并数据

* @param global

* @param data

* @returns {*}*/

functionmerge(global, data) {if (!data) returncopy(global, {});var result =copy(global, {});returncopy(data, result);

}/**

* copy json对象数据

* @param s 源对象

* @param t 目的对象

* @returns {*}*/

functioncopy(s, t) {for (var key ins) {

t[key]=s[key];

}returnt;

}/**

* 将普通数组转化为json对象,json key为数组项值

* 方便判断

* @param arr

* @returns {{}}*/

functiontoJsonArr(arr) {var json ={};for (var i = 0, total = arr.length; i < total; i++) {

json[arr[i]]= "";

}returnjson;

}/**

* 检测json数组中是否包含某个值

* @param jsonArr 该值必须是从toJsonArr函数得来的

* @param val 要检查的值

* @returns {*|boolean} 结果*/

functioncontain(jsonArr, val) {returnjsonArr.hasOwnProperty(val);

}/**

* Ajax请求对象

* @param method 请求类型

* @param url 请求链接

* @param data 发送的数据 json对象or拼接的string数据

* @constructor*/

var Request = function(method, url, data) {this.method =method;this.url =url;this.data = data ||{};this.headers =[];

};/**

* 设置响应数据类型

* @param type 字符串"json"/"xml"等

* @returns {Request}*/Request.prototype.type= function(type) {this.type =type;return this;

};/**

* 设置发送的数据,将覆盖已设置的数据

* @param data json对象or拼接的string数据

* @returns {Request}*/Request.prototype.data= function(data) {this.data =data;return this;

};/**

* 设置新发送的数据

* @param key 参数名/json object

* @param value 参数值

* @returns {Request}*/Request.prototype.push= function(key, value) {if (!key || !value) return;try{

JSON.stringify(key);

copy(key,this.data);

}catch(err) {this.data[key] =value;

}return this;

};/**

* set headers

* @param {[json object]} headers

* @return {[Request]}*/Request.prototype.headers= function(headers) {this.headers =headers;return this;

};/**

* push header item

* @param {[String,JSON]} key

* @param {[String,null]} value

* @return {[Request]}*/Request.prototype.header= function(key, value) {if (!key || !value) return;try{

JSON.stringify(key);

copy(key,this.headers);

}catch(err) {this.headers[key] =value;

}return this;

};/**

* execute interceptors

* @param {[type]} res [description]

* @return {[type]} [description]*/Request.prototype.execuInters= function(res) {//执行拦截器

for (var i = 0, total = interceptors.length; i < total; i++) {//先判断是否是所要拦截的数据响应类型

if (!contain(interceptors[i].type, self.type)) {continue;

}var invoke = interceptors[i].fn(res); //执行拦截器

//检查结果,决定是否继续执行其他拦截器

if (invoke !== undefined && !invoke) {return false;

}

}return true;

};/**

* 发送请求

* @param success 成功响应回调函数

* @param error 错误处理回调函数*/Request.prototype.send= function(success, error) {var self = this;var param ={

url:this.url,

type:this.method

};//设置响应数据类型

if (this.type) {

param.dataType= this.type;

}//设置发送数据

if (this.data && typeof this.data !== 'function') {

param.data= this.data;

}//set headers

if (this.headers && typeof this.headers !== 'function' && JSON.stringify(this.headers).length > 2)) {

param.headers= this.headers;

}//设置成功响应回调函数

if (success && typeof success === 'function') {

param.success= function(res) {if (self.execuInters(res)) { //执行回调

success(res);

}

};

}//设置错误响应回调函数

if (error && typeof error === 'function') {

param.error= function(err) {//正确的请求响应

if (err.status === 200 && err.statusText === "OK") {var response =err.responseText;//如果是json数据,则转化为json对象

try{

response=JSON.parse(response);

}catch(parseError) {

response=err.responseText;

}if (self.execuInters(response)) { //执行回调

success(response);

}

}else{

error(err);

}

};

}

$.ajax(param);

};/**

* 发送POST请求

* @param url 请求地址

* @param data 请求数据,json或拼接的字符串

* @returns {Request} 请求对象*/_Http.post= function(url, data) {return new Request("POST", url, merge(globalData, data));

};/**

* 发送PUT请求

* @param url 请求地址

* @param data 请求数据,json或拼接的字符串

* @returns {Request} 请求对象*/_Http.put= function(url, data) {return new Request("PUT", url, merge(globalData, data));

};/**

* 发送GET请求

* @param url 请求地址

* @param data 请求数据,json或拼接的字符串

* @returns {Request} 请求对象*/_Http.get= function(url, data) {return new Request("GET", url, merge(globalData, data));

};/**

* 发送DELETE请求

* @param url 请求地址

* @param data 请求数据,json或拼接的字符串

* @returns {Request} 请求对象*/_Http.del= function(url, data) {return new Request("DELETE", url, merge(globalData, data));

};/**

* 设置全局请求值

* @param name string or jsonObject

* @param value*/_Http.global= function(name, value) {if (!name || !value) return;try{

JSON.stringify(name);

copy(name, globalData);

}catch(err) {

globalData[name]=value;

}return_Http;

};/**

* 新增一个拦截器

* @param type

* @param fn*/_Http.intercept= function(type, fn) {//type参数可以为单个字符串或数组

if (typeof type === 'string') {

type= [type]; //转化为数组

}

interceptors.push({

type: toJsonArr(type),

fn: fn

});return_Http;

};this.$http =_Http;

})(jQuery);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值