uni-app網(wǎng)絡(luò)封裝思路分享

在之前無(wú)論是iOS氛赐、Android開發(fā)魂爪,還是后來(lái)的flutter開發(fā)時(shí)網(wǎng)絡(luò)請(qǐng)求類都是需要我們自己做一層封裝的,如果不封裝那么我們會(huì)面臨幾個(gè)不便:

  • 請(qǐng)求頭每次網(wǎng)絡(luò)請(qǐng)求都要單獨(dú)設(shè)置
  • 返回?cái)?shù)據(jù)的正確性判斷每次都要重復(fù)大量代碼
  • 返回?cái)?shù)據(jù)格式有變化需要修改所有網(wǎng)絡(luò)請(qǐng)求的地方

針對(duì)這些問(wèn)題我簡(jiǎn)單做了一下封裝艰管,大概解決了以上三個(gè)問(wèn)題

一滓侍、首先在項(xiàng)目根目錄新建文件夾libs,然后文件夾中新建netRequest.js

import Vue from 'vue'
//靜態(tài)資源們
const baseInfo = {
    //網(wǎng)絡(luò)請(qǐng)求的地址
    baseUrl: 你自己的網(wǎng)絡(luò)baseUrl,
    //網(wǎng)絡(luò)請(qǐng)求錯(cuò)誤的統(tǒng)一報(bào)錯(cuò)
    netWrong: '請(qǐng)檢查網(wǎng)絡(luò)',
}

//網(wǎng)絡(luò)請(qǐng)求對(duì)象
export const netRequest = {
    
    //登錄成功時(shí)將獲取的token通過(guò)這個(gè)key存儲(chǔ)起來(lái)牲芋,以后取值也是使用這個(gè)key
    tokenKey: 'tokenKey', 
    
    //登錄地址
    requestLoginProcessAction: baseInfo.baseUrl+'/a/wws/ssys/lg',
    
    //請(qǐng)求方式GET\POST
    method: {
        'GET':'GET',
        'POST':'POST'
    },
    
    //不同接口編碼格式不同撩笆,根據(jù)不同接口設(shè)置編碼格式 
    contentType: {
        'json':'application/json;charset=UTF-8',
        'urlencoded':'application/x-www-form-urlencoded'
    },
    
    getHeaders: function(type){
        //如果不設(shè)置Content-Type那么默認(rèn)為application/json;charset=UTF-8
        var cType = 'application/json;charset=UTF-8';
        if(type){//以設(shè)置的Content-Type為準(zhǔn)
            cType = type;
        }
        
        let _headers = {
            "os": "ios", 
            "version": "1.0.0", 
            "appname": "QQ",
            "Content-Type": cType
        };
        
        //如果當(dāng)前已經(jīng)登錄,那么在請(qǐng)求頭設(shè)置token缸浦,否則不設(shè)置token
        const token = uni.getStorageSync(netRequest.tokenKey);
        if(token){
            console.log('token='+token);
            Vue.set(_headers,'cookie',token)
            //也可以使用Object.assign方式實(shí)現(xiàn)動(dòng)態(tài)添加屬性
            // _headers = Object.assign({},_headers,{'cookie':token})
        }else{
            console.log('token為空');
        }       
        return _headers;
    },
    
    //處理網(wǎng)絡(luò)請(qǐng)求返回的數(shù)據(jù)夕冲,如果成功則返回解析的數(shù)據(jù),如果不成功則返回錯(cuò)誤信息
    isSucc: function(response,succ,fail){
        if(response){
            if(response.statusCode===200){
                if(response.data.statusCode===200){
                    if(succ && typeof(succ)=='function'){
                        succ(response.data.data)
                    }
                }else if(response.data.statusCode===401){//用戶未登錄裂逐,token超時(shí)
                    //登錄超時(shí)歹鱼,一般需要彈出登錄頁(yè)面,讓用戶重新登錄
                }else if(response.data.statusCode===600){//版本升級(jí)
                    uni.showModal({
                        title:'版本升級(jí)',
                        content:'您有新版本可以使用',
                        confirmText:'升級(jí)',
                        confirmColor:'#007AFF',
                        cancelText:'放棄',
                        cancelColor:'#999999',
                        success(res) {
                            if(res.confirm){
                                //點(diǎn)擊升級(jí)按鈕
                            }else if(res.cancel){
                                //點(diǎn)擊放棄升級(jí)
                            }
                        }
                    })
                }else{//本次網(wǎng)絡(luò)成功請(qǐng)求到服務(wù)器卜高,但是服務(wù)器返回的不是定義好的狀態(tài)碼
                    if(fail && typeof(fail)=='function'){
                        fail(response.data.message)
                    } 
                }
            }else{//本次網(wǎng)絡(luò)失敗
                if(fail && typeof(fail)=='function'){
                    fail(response.errMsg)
                }
            }
        }else{//獲取的response為空
            if(fail && typeof(fail)=='function'){
                fail(baseInfo.netWrong)
            }
        }
    }
}
 

二弥姻、將netRequest掛載到vue對(duì)象的屬性上

main.js文件中

import {netRequest} from './libs/netRequest.js'
Vue.prototype.$netRequest = netRequest

這樣我們就不需要每個(gè)頁(yè)面都引入一下

三、使用

                    let _this = this
                    uni.request({
                        header:_this.$netRequest.getHeaders(_this.$netRequest.contentType.urlencoded),
                        url:_this.$netRequest.requestLoginProcessAction,
                        data:{'username':'zhangjing','password':'123456'},
                        method:_this.$netRequest.method.POST,
                        success(res) {
                            //請(qǐng)求成功掺涛,對(duì)獲取的response數(shù)據(jù)進(jìn)行處理
                            _this.$netRequest.isSucc(res,function(data){
                                //本次網(wǎng)絡(luò)請(qǐng)求成功庭敦,獲取處理好之后可以使用的數(shù)據(jù)
                            },function(errStr){
                                //本次網(wǎng)絡(luò)請(qǐng)求成功,但是數(shù)據(jù)有問(wèn)題薪缆,例如密碼錯(cuò)誤
                                uni.showToast({
                                    title: errStr,
                                    icon:'none',
                                    duration:3000
                                });
                            })
                        },
                        fail(res) {
                            //本次網(wǎng)絡(luò)請(qǐng)求失敗了秧廉,沒有請(qǐng)求到服務(wù)器
                        },
                        complete() {
                            //本次網(wǎng)絡(luò)請(qǐng)求完成了,無(wú)論成功還是失敗都會(huì)調(diào)用
                        }
                    })

??這里需要注意_this,在網(wǎng)絡(luò)請(qǐng)求的success定血、fail赔癌、complete使用this獲取的不是本頁(yè)的上下文

GitHub:https://github.com/jizhigang/netRequest

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市澜沟,隨后出現(xiàn)的幾起案子灾票,更是在濱河造成了極大的恐慌,老刑警劉巖茫虽,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刊苍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門移剪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人婴氮,你說(shuō)我怎么就攤上這事《苤拢” “怎么了主经?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)庭惜。 經(jīng)常有香客問(wèn)我罩驻,道長(zhǎng),這世上最難降的妖魔是什么护赊? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任惠遏,我火速辦了婚禮,結(jié)果婚禮上骏啰,老公的妹妹穿的比我還像新娘节吮。我一直安慰自己,他們只是感情好判耕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布透绩。 她就那樣靜靜地躺著,像睡著了一般祈秕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雏胃,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天请毛,我揣著相機(jī)與錄音,去河邊找鬼瞭亮。 笑死方仿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仙蚜,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼此洲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了委粉?” 一聲冷哼從身側(cè)響起呜师,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贾节,沒想到半個(gè)月后汁汗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栗涂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年知牌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斤程。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡角寸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忿墅,到底是詐尸還是另有隱情扁藕,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布球匕,位于F島的核電站纹磺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏亮曹。R本人自食惡果不足惜橄杨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望照卦。 院中可真熱鬧式矫,春花似錦、人聲如沸役耕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瞬痘。三九已至故慈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間框全,已是汗流浹背察绷。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留津辩,地道東北人拆撼。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓容劳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親闸度。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竭贩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349