微信小程序wx.request的簡單封裝

這些天團隊里開始做小程序開發(fā)了暴拄,之前沒做過,都是第一次编饺,第一次的感覺大家都懂的乖篷。周末看了一下小程序項目的代碼,在網(wǎng)絡請求上發(fā)現(xiàn)了一些小問題透且,最終沒忍住想了點辦法把request封裝了一下撕蔼。下面來看看吧。

看項目代碼時發(fā)現(xiàn)了下面幾點問題:

  • 網(wǎng)絡請求都寫在Page里秽誊,每個請求都要重復的寫wx.request以及一些基礎配置鲸沮;
  • 每個頁面里都要處理相同類型的異常;
  • 后端返的http status code為200以外時养距,并不能直接進入fail對應函數(shù)進行處理诉探;

針對這些問題,首先在項目目錄里新建了一個apis的目錄棍厌,把所有與API請求的東西都放在這個目錄里肾胯,如下圖這樣竖席。

apis目錄結(jié)構(gòu)

1. 新建一個request類,對wx.request進行簡單封裝
在request類里做了以下幾件事:

  • 在構(gòu)造函數(shù)里創(chuàng)建默認請求的http header敬肚,可以在header里配制一些內(nèi)容毕荐,在對應請求方法中如果沒有設置header參數(shù),就使用此默認header參數(shù)艳馒;
  • 以get post delete put等方法對request進行封裝憎亚,在發(fā)起網(wǎng)絡請求不需要重復的寫wx.request({method:xxx})這些代碼,只要調(diào)用getRequest弄慰、postRequest等方法就可以了第美;
  • 在rquest的結(jié)果返回處理函數(shù)success中,判定服務端返回的狀態(tài)代碼陆爽,對于200狀態(tài)代碼的按業(yè)務處理成功處理什往,對于非200的狀態(tài)碼按異常處理。
  • 預留統(tǒng)一異常處理函數(shù)處理接口慌闭,可以通過setErrorHandler來設置統(tǒng)一的異常處理别威,這樣對于一些可以統(tǒng)一處理的異常就不用在業(yè)務頁面里去重復處理了,例如后端返回401的代碼驴剔,就可以統(tǒng)一轉(zhuǎn)到登錄頁面讓用戶登錄了省古;
  • 此request不限定服務提供都,可以是自己開發(fā)的業(yè)務服務端丧失,也可以用于第三方服務的調(diào)用豺妓;
/**
 * name: api.js
 * description: request處理基礎類
 * author: 徐磊
 * date: 2018-5-19
 */
class request {
  constructor() {
    this._header = {}
  }

/**
 * 設置統(tǒng)一的異常處理
 */
  setErrorHandler(handler) {
    this._errorHandler = handler;
  }

  /**
   * GET類型的網(wǎng)絡請求
   */
  getRequest(url, data, header = this._header) {
    return this.requestAll(url, data, header, 'GET')
  }

  /**
   * DELETE類型的網(wǎng)絡請求
   */
  deleteRequest(url, data, header = this._header) {
    return this.requestAll(url, data, header, 'DELETE')
  }

  /**
   * PUT類型的網(wǎng)絡請求
   */
  putRequest(url, data, header = this._header) {
    return this.requestAll(url, data, header, 'PUT')
  }

  /**
   * POST類型的網(wǎng)絡請求
   */
  postRequest(url, data, header = this._header) {
    return this.requestAll(url, data, header, 'POST')
  }

  /**
   * 網(wǎng)絡請求
   */
  requestAll(url, data, header, method) {
    return new Promise((resolve, reject) => {
      wx.request({
        url: url,
        data: data,
        header: header,
        method: method,
        success: (res => {
          if (res.statusCode === 200) {
            //200: 服務端業(yè)務處理正常結(jié)束
            resolve(res)
          } else {
            //其它錯誤,提示用戶錯誤信息
            if (this._errorHandler != null) {
            //如果有統(tǒng)一的異常處理利花,就先調(diào)用統(tǒng)一異常處理函數(shù)對異常進行處理
              this._errorHandler(res)
            }
            reject(res)
          }
        }),
        fail: (res => {
          if (this._errorHandler != null) {
            this._errorHandler(res)
          }
          reject(res)
        })
      })
    })
  }
}

export default request

2. 新建一個agriknow類
在agriknow里面做了以下幾件事:

  • 實現(xiàn)所有業(yè)務服務調(diào)用科侈,如查詢所有新聞列表【getNews】,查詢所有課程列表【getCourseList】炒事;
  • 實現(xiàn)統(tǒng)一的異常處理臀栈,并傳給request;
  • 將服務端返回的結(jié)果response轉(zhuǎn)成response.data回傳給API調(diào)用的地方挠乳;
/**
 * name: agriknow.js
 * description: 農(nóng)知匯服務器提供的服務
 * author: 徐磊
 * date: 2018-5-19
 */
import request from './request.js'
class agriknow {
  constructor() {
    this._baseUrl = 'https://apis.xxx.xxx.com/dev/apis/train/v1/'
    this._defaultHeader = { 'Content-Type': 'application/json' }
    this._request = new request
    this._request.setErrorHandler(this.errorHander)
  }

  /**
   * 統(tǒng)一的異常處理方法
   */
  errorHander(res) {
    console.error(res)
  }

  /**
   * 查詢所有新聞列表
   */
  getNews(page = 1, size = 10) {
    let data = { page: page, size: size }
    return this._request.getRequest(this._baseUrl + 'news/client', data).then(res => res.data)
  }

  /**
   * 獲取所有課程
   */
  getCourseList(page = 1, size = 10, key = null) {
    let data = key != null ? { page: page, size: size, queryValue: key } : { page: page, size: size }
    return this._request.getRequest(this._baseUrl + '/course/mobile', data).then(res => res.data)
  }
}
export default agriknow

3. 函數(shù)的調(diào)用

  • 在app中引用argriknow
    import agriknow from './apis/agriknow.js'
    App({
      onLaunch: function () {
        // 展示本地存儲能力
        var logs = wx.getStorageSync('logs') || []
        logs.unshift(Date.now())
        wx.setStorageSync('logs', logs)
    ……
    ……
    
  • 定義一個類型為agriknow的屬性并實例化
    import agriknow from './apis/agriknow.js'
    App({
      onLaunch: function () {
        // 展示本地存儲能力
        var logs = wx.getStorageSync('logs') || []
        logs.unshift(Date.now())
        wx.setStorageSync('logs', logs)
    ……
    ……
      },
      agriknow:new agriknow()
    })
    
  • 在Page里調(diào)用
    const app = getApp();
    Page({
      data: {
        courseData: [],
        page: 1,
        size: 10,
        total: 0
      },
      onLoad: function () {
      ……
      ……
        wx.startPullDownRefresh()
        this.getdataList();
      },
      //查詢課程列表
      getdataList() {
        app.agriknow.getCourseList(this.data.page++, this.data.size, '')
          .then(res => {
            wx.stopPullDownRefresh()
            let list = this.data.page > 2 ? this.data.courseData.concat(res.list) : res.list
            this.setData({
              courseData: list
            })
          })
          .catch(res => {
            wx.stopPullDownRefresh()
            wx.showToast({
              title: '出錯了权薯!',
              icon: 'none'
            })
          })
      },
      //下拉刷新
      onPullDownRefresh() {
        console.log("下拉刷新");
        this.getdataList();
      },
      ……
      ……
    })
    

所有的東西大概就是這個樣子了,就這么個意思睡扬,希望對大家有點用盟蚣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(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
  • 正文 為了忘掉前任腔稀,我火速辦了婚禮,結(jié)果婚禮上羽历,老公的妹妹穿的比我還像新娘焊虏。我一直安慰自己,他們只是感情好秕磷,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布诵闭。 她就那樣靜靜地躺著,像睡著了一般澎嚣。 火紅的嫁衣襯著肌膚如雪疏尿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天易桃,我揣著相機與錄音褥琐,去河邊找鬼。 笑死晤郑,一個胖子當著我的面吹牛敌呈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播造寝,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼磕洪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诫龙?” 一聲冷哼從身側(cè)響起析显,我...
    開封第一講書人閱讀 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級特大地震影響陨簇,放射性物質(zhì)發(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

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