微信小程序wx.request攔截器

一.
請求后臺的時候宫补,服務端對每一個請求都會驗證權限鞍陨,而前端也需要對服務器返回的特殊狀態(tài)碼統(tǒng)一處理噪猾,所以可以針對業(yè)務封裝請求。
首先我們通過request攔截器在每個請求頭里面塞入token等信息脐湾,好讓后端對請求進行權限驗證。并創(chuàng)建一個respone攔截器叙淌,當服務端返回特殊的狀態(tài)碼秤掌,我們統(tǒng)一做處理愁铺,如未登錄網(wǎng)絡錯誤等操作。

二.

  1. 首先了解小程序官方api-wx.request()闻鉴,通過示例可以看出wx.request的參數(shù)是一個對象茵乱,擁有傳輸?shù)刂罚瑐鬏攦?nèi)容孟岛,響應頭瓶竭,成功失敗回調函數(shù)等屬性和方法,我們可以通過封裝相應的響應頭和成功失敗回調函數(shù)達到相應的目的:
// 官方代碼示例
wx.request({
  url: 'test.php', //僅為示例渠羞,并非真實的接口地址
  data: {
    x: '',
    y: ''
  },
  header: {
    'content-type': 'application/json' // 默認值
  },
  success (res) {
    console.log(res.data)
  }
 fail(res){
  console.log(res)
 }
})

2.封裝
封裝請求頭和返回的狀態(tài)碼(注:具體頭需要添加哪些屬性斤贰,返回的狀態(tài)碼處理,是根據(jù)與后臺實際溝通所需的參數(shù)來制定的)

const app = getApp();
const appid = 'xxxx';
const appSecret = 'xxxxxx';
let  ajaxNum = 0;

// 獲取accessToken
function getAccessToken(callback) {
  wx.request({
    url:  '/api/Token',
    data: {
      appid: aesEncrypt(appid),// aesEncrypt():自定義的用crypto-js.js進行aes加密的方法,這里只需要知道加密了即可次询,不需要關注此方法
      appSecret: aesEncrypt(appSecret),
    },
    success: function (res) {
      if(res.statusCode ===200 && res.data.code === 0) {
        let accesstoken = res.data.data.accesstoken;
        if (typeof (callback) === 'function' && accesstoken) {
          callback(accesstoken);
        }
      }
    },
  })
}

// 封裝request請求
const myRequest = options => {
  if(options) {
    getAccessToken(function (accesstoken){
      // header 設置Content-Type荧恍,accesstoken, usertoken, noncestr, timestamp等信息,與后臺協(xié)商好
      if(options.header === undefined || options.header === null) {
        options.header = {};
      }
     options.header['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
      // usertoken在登錄后保存在緩存中屯吊,所以從緩存中取出送巡,放在header
      let usertoken = wx.getStorageSync('usertoken');
      if (usertoken) {
        options.header['usertoken'] = usertoken;
      }
      // 自定義getNoncestr()設置隨機字符串,getTimestamp()獲取時間戳
      let noncestr = getNoncestr();
      let timestamp = getTimestamp();
      // sign進行加密
      let sign = getSign(accesstoken, appid, appSecret, noncestr, timestamp);
      if (timestamp) {
        options.header['timestamp'] = timestamp;
      }
      if (noncestr) {
        options.header['noncestr'] = noncestr;
      }
      if (sign) {
        options.header['sign'] = sign;
      }
      //url
      let baseUrl = config.BASE_HOST;
      if (options.url.indexOf('http') != 0) {
        options.url = baseUrl + options.url;
      }
     // method盒卸、data
    if (options.method === undefined || options.method === null) {
      options.method = 'post';
    }
    if (options.method.toLowerCase() === 'post') {
      if(options.data) {
        let dataStr = JSON.stringify(options.data);
        let base64Str = base64Encrypt(dataStr);
        options.data = serializeData({ param: base64Str });
      }
    }
    //success
    if (options.success && typeof(options.success) === 'function') {
      let successCallback = options.success;
      options.success = function(res) {
        // 判斷不同的返回碼 200/404
        if (res.statusCode === 200) {
          try {
          // 接收的后臺數(shù)據(jù)用自定義base64解密方法解密后轉為對象 
            let str = base64Decrypt(res.data);
            let data = JSON.parse(str);
            if (parseInt(data.resultCode, 10) === -1) {//后臺商議好的狀態(tài)碼骗爆,-2未登錄,-1-3后臺出錯
              console.error('網(wǎng)絡超時世落,請稍后重試');
            } else if (parseInt(data.resultCode, 10) === -3) {
              console.error(data.msg);
            } else if (parseInt(data.resultCode, 10) === -2){
              console.log("用戶未登錄-ajax");
            }
            res.data = data;
            //調用自定義的success
            successCallback(res);
          } catch (e) {
            console.error('出錯了淮腾,' + e + ',接口返回數(shù)據(jù):' + res.data);
          }
        } else if(res.statusCode === 404) {
            console.log('404');
        }
      }
    }
      //執(zhí)行微信的請求
      wx.request(options);
    });
  } 
}


module.exports = {
  myRequest: myRequest
}

頁面調用示范(與wx.request傳參一致):

const ajax = require('ajax.js');
 ajax.javaRequest({
      url: '/xxx',
      data: {
        xxxx: xxx
      },
      method: 'POST',
      success: res => {
            console.log(res, '成功')
      }
    })
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屉佳,隨后出現(xiàn)的幾起案子谷朝,更是在濱河造成了極大的恐慌,老刑警劉巖武花,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圆凰,死亡現(xiàn)場離奇詭異,居然都是意外死亡体箕,警方通過查閱死者的電腦和手機专钉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來累铅,“玉大人跃须,你說我怎么就攤上這事⊥奘蓿” “怎么了菇民?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我第练,道長阔馋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任娇掏,我火速辦了婚禮呕寝,結果婚禮上,老公的妹妹穿的比我還像新娘婴梧。我一直安慰自己下梢,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布志秃。 她就那樣靜靜地躺著怔球,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浮还。 梳的紋絲不亂的頭發(fā)上竟坛,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音钧舌,去河邊找鬼担汤。 笑死,一個胖子當著我的面吹牛洼冻,可吹牛的內(nèi)容都是我干的崭歧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼撞牢,長吁一口氣:“原來是場噩夢啊……” “哼率碾!你這毒婦竟也來了?” 一聲冷哼從身側響起屋彪,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤所宰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畜挥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仔粥,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年蟹但,在試婚紗的時候發(fā)現(xiàn)自己被綠了躯泰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡华糖,死狀恐怖麦向,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情客叉,我是刑警寧澤磕蛇,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布景描,位于F島的核電站,受9級特大地震影響秀撇,放射性物質發(fā)生泄漏。R本人自食惡果不足惜向族,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一呵燕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧件相,春花似錦再扭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至紊撕,卻和暖如春罢荡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背对扶。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工区赵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浪南。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓笼才,卻偏偏與公主長得像,于是被迫代替她去往敵國和親络凿。 傳聞我的和親對象是個殘疾皇子骡送,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345