封装的意义在于复用,在于减少重复的代码。

我在项目中做了简单的Ajax请求封装,实现方式如下:

1 //封装Ajax请求
2 $.extend({
3 ajaxDirect:function(url,type,data,success,error){
4 if(type.toLowerCase()=='post'){
5 data = pack(data)
6 }
7 $.ajax({
8 type: type,
9 url: base + url,
10 contentType:'application/json',
11 data:data,
12 beforeSend: function (XMLHttpRequest) {
13 XMLHttpRequest.setRequestHeader("X-Token", sessionStorage.token)
14 },
15 success: function(data){
16 success(data)
17 },
18 error: function(data){
19 error(data)
20 },
21 dataType: "json"
22 })
23 }
24 })

其中的要点为:

1.使用jQ的$.extend函数,则调用时只需用$.ajaxDirect(url,type,data,function(){},function(){})即可,若data无值,则传空对象过来。

2.pack为JSON.stringify的封装,即

1 //对象序列化
2 function pack(data) {
3 return JSON.stringify(data)
4 }
5
6 function unpack(data) {
7 return JSON.parse(data)
8 }

3.该项目在请求时需要传token,则我在请求时在请求头部统一加上了token,即

1 beforeSend: function (XMLHttpRequest) {
2 XMLHttpRequest.setRequestHeader("X-Token", sessionStorage.token)
3 }

4.base为请求的统一前缀,为公共变量,可自定义值。

 

调用示例:

GET请求

1 $.ajaxDirect("/user/info",'GET',{},
2 function (data) {
3 //发送成功
4 },
5 function (data) {
6 //发送失败
7 }
8 )

POST请求

1 var data = {
2 password:$('.newPwd').val()
3 }
4
5 $.ajaxDirect("/farmer/farmeruser/changePassword",'POST',data,
6 function(data){
7 //发送成功
8 },
9 function(data){
10 //发送失败
11 }
12 )

在这个基础上,我们可以进一步完善封装的Ajax。

//封装Ajax请求
$.extend({
ajaxDirect:function(url,type,data,success,error,requestType){
if(requestType!=='pic'&&type.toLowerCase()=='post'){
data = pack(data)
}
var request = {
type: type,
url: base + url,
contentType:'application/json',
data:data,
beforeSend: function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("X-Token", sessionStorage.token)
},
success: function(data){
//token过期
if(data.message==="token过期"){
$.ajax(
{
type: 'POST',
url: base+'/refleshToken',
contentType:'application/json',
data:pack({
token:sessionStorage.token
}),
success: function(data){
console.log(data)
sessionStorage.token = data.data.token
location.reload()
},
error: function(){
$.toast("发送失败", "text")
},
dataType: "json"
})
}else{
success(data)
}
},
error: function(data){
error(data)
},
dataType: "json"
}
if(requestType==='pic'){
request.cache = false
request.processData = false
request.contentType = false
}

if(requestType==='login'){
request.beforeSend = false
}
$.ajax(request)
}
})

上面的代码相比第一段代码增加的功能有:

1.增加了POST的大小写适配

2.增加了token过期后统一请求新的token的接口

3.增加了参数requestType,可传可不传,用于区分请求的类型,从而设置请求头的参数。