小程序request的封裝

wx.request 的封裝

小程序提供了request的網(wǎng)絡(luò)接口,用于服務(wù)器交互距境。但是我們在開發(fā)的過程中發(fā)現(xiàn)了以下問題:

  • 每個頁面中都要去寫一些重復(fù)的相關(guān)配置浊闪,比如header
  • 沒有統(tǒng)一的loading提示管理
  • 沒有統(tǒng)一的錯誤處理機(jī)制
  • 頁面邏輯與請求服務(wù)器代碼混在一起,比較混亂本慕,不好調(diào)試

統(tǒng)一header問題

發(fā)起請求時峭跳,服務(wù)器有些接口需要驗證用戶身份膘婶,一般是會把用戶登錄之后的token設(shè)置在header中,回傳給服務(wù)器蛀醉,我們可以寫一個通用的方法:

/**
 * 獲取header
 */
function getCommonHeader() {

  let header = {
    'Content-type': 'application/x-www-form-urlencoded'
  };

  // 如果token有值則帶上
  let token = wx.getStorageSync("token");
  if (token) {
    header = Object.assign({}, header, {
      'Authorization': 'Bearer ' + token
    });
  }

  return header;
};

統(tǒng)一loading管理

為了防止用戶多次點擊以及更好的用戶體驗悬襟,一般發(fā)起請求時會加上loading動畫,服務(wù)器返回之后再去掉這個loading拯刁。但是產(chǎn)品設(shè)計時也有不加loading動畫和自定義loading文字的需求脊岳,所以我們可以添加一個控制開關(guān) showLoadingloadingTitle ,由外部調(diào)用時設(shè)置。

統(tǒng)一錯誤處理機(jī)制

這里需要和服務(wù)器約定統(tǒng)一返回結(jié)果格式割捅,比如:

{"code": 0, "data": "", "msg": "ok"}

解釋一下:

  • code 表示本次請求的狀態(tài)碼
  • data 是服務(wù)器返回的數(shù)據(jù)
  • msg 業(yè)務(wù)錯誤提示

首先對此次請求的http狀態(tài)判斷奶躯,非 200 則表示此次請求失敗了,可能是 500 服務(wù)器報錯亿驾,也可能是 404 請求服務(wù)器url未找到等等嘹黔。
接著對業(yè)務(wù)狀態(tài)判斷,這個由服務(wù)器約定莫瞬,比如 0 表示成功儡蔓,非 0 則表示業(yè)務(wù)錯誤,一般直接 toast 提示服務(wù)器返回的 msg 就可以了疼邀,這樣就對服務(wù)器錯誤進(jìn)行了統(tǒng)一處理喂江。
但是和 loading 一樣,有些頁面需要有特殊的錯誤處理檩小,這時我們也添加一個控制開關(guān) showToast 开呐,由調(diào)用時控制是否顯示統(tǒng)一的錯誤信息。

接口promise化

為了調(diào)用時少些回調(diào)规求,我們把這個request接口包裝成一個promise,調(diào)用時直接使用 thencatch 來處理業(yè)務(wù)卵惦。最終的代碼如下:


/**
 * 網(wǎng)絡(luò)請求
 */
function request(url, data = {}, header = {}, method = "POST", config = {}) {

  // header 空值處理
  let _header = {
    "content-type": "application/x-www-form-urlencoded"
  };
  if (Object.keys(header).length > 0) {
    _header = header;
  }

  let showToast = true,
    showLoading = false,
    loadingTitle = "加載中阻肿。。沮尿。";
  // 默認(rèn)顯示toast
  if (config['showToast'] != undefined && config['showToast'] == false) {
    showToast = false;
  }
  // 默認(rèn)顯示loading
  if (config['showLoading'] != undefined && config['showLoading'] == true) {
    showLoading = true;
  }
  if (config['loadingTitle']) {
    loadingTitle = config['loadingTitle'];
  }

  return new Promise((resolve, reject) => {
    // 是否顯示loading
    if (showLoading) {
      wx.showLoading({ title: loadingTitle, icon: 'none', mask: true });
    }

    wx.request({
      url: url,
      data: data,
      header: _header,
      method: method,
      success: (res => {
        if (showLoading) {
          wx.hideLoading();
        }

        // 服務(wù)器 非200 錯誤
        if (res.statusCode && res.statusCode != 200) {
          wx.showToast({ title: '服務(wù)器 ' + res.statusCode + ' 錯誤', icon: 'none' });
          reject(res);
          return;
        }

        if (res.data && res.data.code != 0) {
          // 業(yè)務(wù)狀態(tài)非0 是否提示
          if (showToast) {
            wx.showToast({ title: res.data.msg, icon: 'none' });
          }

          reject(res);
          return;
        }
        resolve(res.data);
      }),
      fail: (err => {
        if (showLoading) {
          wx.hideLoading();
        }

        if (err.errMsg.indexOf('url not in domain list') > -1) {
          wx.showToast({ title: '請求url不在合法域名中丛塌,請打開調(diào)試模式', icon: 'none' });
        }

        reject(err);
      })
    });
  });

};

對于 get 請求和 post 請求我們再包裝一下


/**
 * get 網(wǎng)絡(luò)請求
 */
function getRequest(url, data = {}, header = {}, config = {}){
  return request(url, data, "GET", header, config);
}

/**
 * post 網(wǎng)絡(luò)請求
 */
function postRequest(url, data = {}, header = {}, config = {}){
  return request(url, data, "POST", header, config);
}

我們看看調(diào)用的例子,將上面封裝好的request函數(shù)放到 utils.js里面畜疾,新建一個api.js文件:

const utils = require('../utils.js');

module.exports = {
  getUserInfo: function(data, config = {}){
    return utils.postRequest(
      'http://api.xx.com/get_user_info',
      data,
      utils.getCommonHeaders(),
      config
    );
  }
}

然后頁面調(diào)用:

const api = require('../api.js');
/**
 * 生命周期函數(shù)--監(jiān)聽頁面加載
 */
onLoad: function (options) {
  api.getUserInfo({
      "user_id": "1"
    }, {
      "showLoading": "false",
      "showToast": "false",
      "loadingTitle": "登錄中"
    })
    .then(res => {
      console.log(res);
    });
}

一般情況下上面的 showLoading 參數(shù)等配置項可以不寫赴邻,用默認(rèn)就行,那頁面就更簡潔了

const api = require('../api.js');

api.getUserInfo({"user_id": "1"})
  .then(res => {
    console.log(res);
  });
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啡捶,一起剝皮案震驚了整個濱河市姥敛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞎暑,老刑警劉巖彤敛,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異了赌,居然都是意外死亡墨榄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門勿她,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袄秩,“玉大人,你說我怎么就攤上這事≈纾” “怎么了贮喧?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猪狈。 經(jīng)常有香客問我箱沦,道長,這世上最難降的妖魔是什么雇庙? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任谓形,我火速辦了婚禮,結(jié)果婚禮上疆前,老公的妹妹穿的比我還像新娘寒跳。我一直安慰自己,他們只是感情好竹椒,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布童太。 她就那樣靜靜地躺著,像睡著了一般胸完。 火紅的嫁衣襯著肌膚如雪书释。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天赊窥,我揣著相機(jī)與錄音爆惧,去河邊找鬼。 笑死锨能,一個胖子當(dāng)著我的面吹牛扯再,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播址遇,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼熄阻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了倔约?” 一聲冷哼從身側(cè)響起秃殉,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跺株,沒想到半個月后复濒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡乒省,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年巧颈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袖扛。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡砸泛,死狀恐怖十籍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唇礁,我是刑警寧澤勾栗,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站盏筐,受9級特大地震影響围俘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜琢融,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一界牡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漾抬,春花似錦宿亡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至平绩,卻和暖如春圈匆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馒过。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工臭脓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腹忽。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像砚作,于是被迫代替她去往敵國和親窘奏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容