国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

微信小程序封裝request請求,包含請求攔截器,響應(yīng)攔截器和請求重試功能

這篇具有很好參考價(jià)值的文章主要介紹了微信小程序封裝request請求,包含請求攔截器,響應(yīng)攔截器和請求重試功能。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、需求:

  • 在發(fā)送請求之前,先判斷用戶是否有token,沒有就執(zhí)行登陸請求,將token保存,然后再執(zhí)行原來請求;

  • 擁有token,就直接執(zhí)行請求;但是用戶的這個token可能是過期的,如果執(zhí)行請求發(fā)現(xiàn)用戶登陸過期,就統(tǒng)一返回40001,然后對40001的響應(yīng)統(tǒng)一處理,執(zhí)行登陸請求,再執(zhí)行原來請求。

  • 最終實(shí)現(xiàn)用戶無感登陸的體驗(yàn)效果。

二、流程圖如下:

微信小程序請求攔截器,java專欄,微信小程序,微信小程序,小程序

三、主要代碼

/**
 * 請求攔截器:
 * 在這里實(shí)現(xiàn)的作用是將所有請求前判斷用戶是否授權(quán)獲取用戶信息
 * @param {*} config 
 */
function requestInterceptor(config) {
    console.log("經(jīng)過了請求攔截器")
    return new Promise((resolve, reject) => {
        if (!config.header.authorization) {
            userLogin().then(res =>{
                if(res){
                    config.header.authorization = wx.getStorageSync('userInfo').token
                    resolve(config);
                }
            })
        } else {
            resolve(config);
        }
    });
}
// 響應(yīng)攔截器
function responseInterceptor(response) {
    console.log("經(jīng)過響應(yīng)攔截器")
    return new Promise((resolve, reject) => {
        // 處理響應(yīng)結(jié)果
        if (response.data.flag) {
            resolve(response);
        } else {
            if (response.data.code === 40001) {
                userLogin().then(res => {
                    reject(response)
                })
            } else {
                wx.showToast({
                    title: response.data.message,
                    icon: "error",
                    duration: 2000
                })
            }
        }
    });
}

其中封裝的一個post請求,帶請求頭

其他請求的封裝方法完成類似,懂一個其他就都懂了。
微信小程序請求攔截器,java專欄,微信小程序,微信小程序,小程序

四、完整代碼:

var tokenKey = "userInfo"; // 將登陸憑證儲存以key為“token”儲存在本地
var serverUrl = "http://localhost:8088/wechat"; // 2020

// 例外不用token的地址
// var exceptionAddrArr = ['/user/login', ];
var exceptionAddrArr = [];

//請求頭處理函數(shù)
function CreateHeader(url, type) {
    let header = {}
    if (type == 'POST_PARAMS') {
        header = {
            'content-type': 'application/x-www-form-urlencoded'
        }
    } else {
        header = {
            'content-type': 'application/json'
        }
    }
    if (exceptionAddrArr.indexOf(url) == -1) { //排除請求的地址不須要token的地址
        let token = wx.getStorageSync(tokenKey).token;
        // header.Authorization = token;
        header['authorization'] = token;
    }
    return header;
}

/**
 * 請求攔截器:
 * 在這里實(shí)現(xiàn)的作用是將所有請求前判斷用戶是否授權(quán)獲取用戶信息
 * @param {*} config 
 */
function requestInterceptor(config) {
    console.log("經(jīng)過了請求攔截器")
    return new Promise((resolve, reject) => {
        if (!config.header.authorization) {
            userLogin().then(res =>{
                if(res){
                    config.header.authorization = wx.getStorageSync('userInfo').token
                    resolve(config);
                }
            })
        } else {
            resolve(config);
        }
    });
}

// 響應(yīng)攔截器
function responseInterceptor(response) {
    console.log("經(jīng)過響應(yīng)攔截器")
    return new Promise((resolve, reject) => {
        // 處理響應(yīng)結(jié)果
        if (response.data.flag) {
            resolve(response);
        } else {
            if (response.data.code === 40001) {
                userLogin().then(res => {
                    reject(response)
                })
            } else {
                wx.showToast({
                    title: response.data.message,
                    icon: "error",
                    duration: 2000
                })
            }
        }
    });
}

/**
 * 封裝wx.getUserProfile()方法
 */
function wxGetUserProfile() {
    return new Promise((resolve, reject) => {
        wx.getUserProfile({
            desc: '獲取你的昵稱、頭像、地區(qū)及性別',
            success: (res) => {
                let userInfo = {
                    userName: res.userInfo.nickName,
                    iconUrl: res.userInfo.avatarUrl
                }
                wx.setStorageSync('userInfo', userInfo)
                resolve(userInfo)
            },
            fail: (res) => {
                reject(res)
            }
        })
    })
}

/**
 * 封裝wx.login
 */
function wxLogin() {
    return new Promise((resolve, reject) => {
        wx.login({
            success: (res) => {
                console.log("wxLogin()獲取驗(yàn)證碼:" + res.code)
                resolve(res.code)
            },
            fail: (res) => {
                reject(res)
            }
        })
    })
}

/**
 * 封裝后端登陸方法
 * @param {驗(yàn)證碼} code 
 */
function mpLogin(data) {
    return new Promise((resolve, reject) => {
        wx.request({
            url: serverUrl + '/user/login',
            data: data,
            method: 'POST',
            success: (res => {
                resolve(res.data)
            }),
            fail: (res => {
                reject(res)
            }),
        })
    })
}

/**
 * 調(diào)用wx.login 和 mplogin 完成用戶后端登陸
 */
async function userLogin() {
    let userInfo = wx.getStorageSync('userInfo');
    if (!userInfo) {
        userInfo = await wxGetUserProfile()
    }
    if(!userInfo){
        return;
    }
    let code = await wxLogin();
    let data = {
        code: code,
        userName: userInfo.userName,
        iconUrl: userInfo.iconUrl
    }
    return new Promise((resolve, reject) => {
        mpLogin(data).then(res => {
            if (res.flag) {
                console.log("userLogin()登陸成功返回信息:" + res)
                wx.setStorageSync('userInfo', res.data)
                resolve(true)
            } else {
                wx.showToast({
                    title: res.message,
                    icon: "error",
                    duration: 2000
                })
                resolve(false)
            }
        })
    })
}


//post請求,數(shù)據(jù)按照query方式傳給后端
/**
 * 
 * @param {請求地址} url 
 * @param {請求數(shù)據(jù)} data 
 * @param {重試次數(shù)} times 
 */
function postRequest(url, data = {}, times) {
    // 獲取請求頭
    let header = CreateHeader(url, 'POST');
    return new Promise((resolve, reject) => {
        const config = {
            url: serverUrl + url,
            data: data,
            header:  header,
            method: 'POST',
            success: (res => {
                // 對響應(yīng)統(tǒng)一處理
                responseInterceptor(res)
                    .then(res => {
                        resolve(res.data);
                    }).catch(res => {
                        // 重
                        if (times > 0) {
                            postRequest(url, data, times - 1).then(res => {
                                resolve(res)
                            })
                        } else {
                            wx.showToast({
                                title: '請稍后再試',
                                icon: "loading",
                            })
                        }
                    })
            }),
            fail: (res => {
                reject(res)
            }),
        }
        // 請求攔截器
        requestInterceptor(config)
            .then(config => {
                wx.request(config);
            }).catch(error => {
                reject(error);
            });
    })
}


//get 請求
function getRequest(url, data, times) {
    let header = CreateHeader(url, 'GET');
    return new Promise((resolve, reject) => {
        const config = {
            url: serverUrl + url,
            data: data,
            header: header,
            method: 'GET',
            success: (res => {
                responseInterceptor(res)
                    .then(res => {
                        resolve(res.data);
                    }).catch(res => {
                        // 重
                        if (times > 0) {
                            getRequest(url, data, times - 1).then(res => {
                                resolve(res)
                            })
                        } else {
                            wx.showToast({
                                title: '請稍后再試',
                                icon: "loading",
                            })
                        }
                    })
            }),
            fail: (res => {
                reject(res)
            })
        }
        // 請求攔截器
        requestInterceptor(config)
            .then(config => {
                wx.request(config);
            }).catch(error => {
                reject(error);
            });

    })
}
//put請求
function putRequest(url, data, times) {
    let header = CreateHeader(url, 'PUT');
    return new Promise((resolve, reject) => {
        const config = {
            url: serverUrl + url,
            data: data,
            header: header,
            method: 'PUT',
            success: (res => {
                responseInterceptor(res)
                    .then(res => {
                        resolve(res.data);
                    }).catch(res => {
                        // 重
                        if (times > 0) {
                            putRequest(url, data, times - 1).then(res =>{
                                resolve(res)
                            })
                        } else {
                            wx.showToast({
                                title: '請稍后再試',
                                icon: "loading",
                            })
                        }
                    })
            }),
            fail: (res => {
                reject(res)
            })
        }
    })
}
//delete請求
function deleteRequest(url, data, times) {
    let header = CreateHeader(url, 'DELETE');
    return new Promise((resolve, reject) => {
        const config = {
            url: serverUrl + url,
            data: data,
            header: header,
            method: 'DELETE',
            success: (res => {
                responseInterceptor(res)
                    .then(res => {
                        resolve(res.data);
                    }).catch(res => {
                        if (times > 0) {
                            deleteRequest(url, data, times - 1).then(res =>{
                                resolve(res)
                            })
                        } else {
                            wx.showToast({
                                title: '請稍后再試',
                                icon: "loading",
                            })
                        }
                    })
            }),
            fail: (res => {
                reject(res)
            })
        }
        // 請求攔截器
        requestInterceptor(config)
            .then(config => {
                wx.request(config);
            }).catch(error => {
                reject(error);
            });
    })
}



//導(dǎo)入
module.exports = {
    getRequest: getRequest,
    postRequest: postRequest,
    putRequest: putRequest,
    deleteRequest: deleteRequest,
    userLogin: userLogin,
}

五、使用示范:

const re = require('../../utils/request.js');	// 導(dǎo)入

Page({
  btCreateSubject(e){
      re.postRequest("/subject/create",{
          subjectName:"學(xué)習(xí)強(qiáng)國3"
      },2).then(res =>{
        console.log("創(chuàng)建科目成功返回?cái)?shù)據(jù):")
        console.log(res)
    })
  },
})
  • 在用戶沒有token的情況下:

    1. 進(jìn)行請求攔截器,調(diào)用了登陸方法:
      微信小程序請求攔截器,java專欄,微信小程序,微信小程序,小程序
    2. 執(zhí)行原來的操作,得到結(jié)果
      微信小程序請求攔截器,java專欄,微信小程序,微信小程序,小程序
  • 在用戶有token的情況下,但是服務(wù)器已經(jīng)沒有維護(hù)用戶的登陸狀態(tài)了

    1. redis當(dāng)中沒有維護(hù)用戶狀態(tài)了
      微信小程序請求攔截器,java專欄,微信小程序,微信小程序,小程序

    2. 原本請求–>登陸請求–>原本請求
      微信小程序請求攔截器,java專欄,微信小程序,微信小程序,小程序

    3. 后端已經(jīng)維持用戶登陸狀態(tài)
      微信小程序請求攔截器,java專欄,微信小程序,微信小程序,小程序文章來源地址http://www.zghlxwxcb.cn/news/detail-649509.html

總結(jié):

  • 雖然這樣封裝看起來挺復(fù)雜的,但是對于用戶來說是一種很好的體驗(yàn)。對于普通的網(wǎng)站,如果發(fā)現(xiàn)你你的登陸過期,又得重新輸入密碼注冊。但是這樣我們無全不需要,只要你已經(jīng)是登陸過的用戶,除非你清除了小程序的緩存,否則在你接下來使用過程中都不需要再手機(jī)登陸。
  • 其次,對于前端js編寫來說,不需要在每個請求前都去判斷用戶是否本地緩存有token,都在由請求攔截器統(tǒng)一處理。對于請求后的響應(yīng),我們不需要去處理各種情況,只需要處理成功的情況就可以了。

關(guān)于實(shí)現(xiàn)小程序用戶“無感”登陸的方法,我相信這不是最優(yōu)解,但是這是我目前能想到最好的解決辦法了。如果小伙伴有更好的登陸流程,歡迎在評論區(qū)告訴我,一起討論~

到了這里,關(guān)于微信小程序封裝request請求,包含請求攔截器,響應(yīng)攔截器和請求重試功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • uniapp微信小程序封裝網(wǎng)絡(luò)請求 @escook/request-miniprogram

    uniapp微信小程序封裝網(wǎng)絡(luò)請求 @escook/request-miniprogram

    官網(wǎng)地址:https://www.npmjs.com/package/@escook/request-miniprogram 1、下載依賴 2、引入 把下面代碼放到 main.js 3、發(fā)起請求 4、請求成功 可以看到請求成功了,并執(zhí)行了登入成功的邏輯。 每次發(fā)起請求后,都要自己寫if語句判斷請求是否成功,非常麻煩。我們可以修改一下源碼解決這個

    2024年02月10日
    瀏覽(21)
  • uniapp 微信小程序 封裝axios 包含請求攔截、響應(yīng)攔截、無感刷新令牌功能

    前言: 1、為什么不適用uniapp自帶的請求功能? 答:uniapp自帶的請求功能,再刷新了令牌后,重新請求返回的數(shù)據(jù)無法返回給發(fā)起請求的方法。也就是說,刷新令牌后重新發(fā)起的請求和第一次發(fā)起請求的方法是割裂的。 2、封裝文件中,我設(shè)置了無感刷新令牌功能。我后臺的

    2024年02月03日
    瀏覽(21)
  • 【JWT】SpringBoot+微信小程序根據(jù)指定參數(shù)生成Token、更新Token、判斷Token是否已經(jīng)過期、封裝wx.request請求更新Token并判斷Token是否過期

    微信小程序js代碼 微信小程序點(diǎn)擊登錄按鈕調(diào)用該方法 java后端代碼 getUserCode方法為獲取用戶的唯一標(biāo)識openId userLogin方法用于用戶授權(quán)登錄并獲取Token userLogin實(shí)現(xiàn)類方法 封裝了wx的request請求,每次發(fā)起請求的時(shí)候都走一遍更新Token的接口/user/updateTokenTime,如果接口返回offlin

    2024年02月04日
    瀏覽(25)
  • 【uniapp&微信小程序】封裝uni.request()

    【uniapp&微信小程序】封裝uni.request()

    前言 ? ? ? ? 在項(xiàng)目開發(fā)過程中,往往需要對請求進(jìn)行二次封裝,這篇文章將對uni.request()進(jìn)行二次封裝,并實(shí)現(xiàn)多個環(huán)境的請求配置,對請求方式,數(shù)據(jù)格式等進(jìn)行封裝,將請求做到最簡化。 一.封裝uni.request() 第一步基于 uni.request() 進(jìn)行二次封裝,集成項(xiàng)目開發(fā)中需要的參

    2024年02月09日
    瀏覽(25)
  • 微信小程序封裝請求

    封裝請求 解決的問題 很多頁面中請求的 url 前半部分都是一樣的,重復(fù)書寫導(dǎo)致頁面代碼冗余復(fù)雜同時(shí)邏輯容易不清晰,所以采用單獨(dú)將請求封裝成一個文件(模塊)使得這些問題得到解決。 前期基礎(chǔ)知識 uni.request(wx.request) Promise 具體步驟 創(chuàng)建文件夾及文件 在根目錄下

    2024年02月11日
    瀏覽(16)
  • 微信小程序 基于Promise 對 wx.request 封裝處理

    微信小程序 基于Promise 對 wx.request 封裝處理

    當(dāng)我們進(jìn)行微信小程序開發(fā)的時(shí)候,會經(jīng)常涉及到發(fā)送網(wǎng)絡(luò)請求來進(jìn)行后臺數(shù)據(jù)交互,而在微信小程序中,用來 發(fā)送請求的方法是 wx.request() , 但是由于 wx.request() 方法 不支持 Promise 風(fēng)格的調(diào)用,所以導(dǎo)致 wx.request() 用來發(fā)送異步請求的時(shí)候,會觸發(fā)成 回調(diào)地獄 的表現(xiàn), 以及

    2024年02月04日
    瀏覽(31)
  • 微信小程序網(wǎng)絡(luò)請求封裝

    網(wǎng)絡(luò)請求地址放到url.js中,分別制定開發(fā)環(huán)境,體驗(yàn)環(huán)境,線上環(huán)境 網(wǎng)絡(luò)請求的方法放到request.js中,暴露get、post、wxLogin方法 請求前顯示加載中,請求結(jié)束后隱藏加載中 請求的接口方法,放到api.js中,并調(diào)用request.js中對應(yīng)的方法 2.1 請求地址(url.js) 2.3 具體的請求方法(api.

    2024年02月15日
    瀏覽(18)
  • 【小程序教程】微信小程序之request網(wǎng)絡(luò)請求

    微信小程序提供了request網(wǎng)絡(luò)請求的API,可以用于與后臺服務(wù)器進(jìn)行數(shù)據(jù)交互,實(shí)現(xiàn)數(shù)據(jù)的獲取和提交等功能。在本文中,將介紹如何使用request網(wǎng)絡(luò)請求API,并提供一個示例代碼,幫助大家更好地理解。 使用request網(wǎng)絡(luò)請求API的步驟如下: 在小程序頁面中,需要在頁面或者組

    2024年02月04日
    瀏覽(19)
  • 【微信小程序】使用 wx.request 方法進(jìn)行異步網(wǎng)絡(luò)請求

    在微信小程序中,你可以使用 wx.request 方法進(jìn)行異步網(wǎng)絡(luò)請求,并將獲取到的列表數(shù)據(jù)渲染到 UI 上。 首先,在頁面的 data 中定義一個數(shù)組變量,用于存儲獲取到的列表數(shù)據(jù),例如: 然后,在頁面的生命周期函數(shù) onLoad 或需要觸發(fā)網(wǎng)絡(luò)請求的函數(shù)中,使用 wx.request 方法發(fā)送異

    2024年02月16日
    瀏覽(42)
  • 微信小程序基于Promise封裝發(fā)起網(wǎng)絡(luò)請求

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包