jQuery-实现简单的Ajax请求封装

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

我在项目中做了简单的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,可传可不传,用于区分请求的类型,从而设置请求头的参数。

posted @ 2019-11-28 22:36  罗毅豪  阅读(3391)  评论(0编辑  收藏  举报