【小程式taro最佳實踐】http請求封裝(方便使用,增加token,統一錯誤日誌記錄和上報)

starkwang發表於2018-09-27

給大家提供思路,可以借鑑哈,有什麼問題可以留言 taro腳手架後面文章會慢慢講解更多技巧 github.com/wsdo/taro-k…

為什麼封裝

當我們開發小程式的時候,經常會用到http請求,當然官方已經提供了請求的介面,但是我們每次請求的時候,可能會加上token,每次請求都會加上,如果不封裝起來,會相當的麻煩,那麼又怎麼封裝呢?

特性

  • 暴露get方法
  • 暴露post方法
  • post自定義contentType
  • 增加配置檔案
  • token定義
  • 新增判斷狀態,記錄異常資訊
  • 增加異常錯誤logError日誌
  • 增加統一日誌上報

設計

需要對外暴露介面:get post 引數:url,傳輸的資料,請求頭 這樣我們可以很方便的使用了

在/service/下新建立一個api.js

baseOptions 方法

baseOptions(params, method = 'GET') {
    let { url, data } = params
    let contentType = 'application/x-www-form-urlencoded'
    contentType = params.contentType || contentType
    const option = {
      isShowLoading: false,
      url: base + url,
      data: data,
      method: method,
      header: { 'content-type': contentType, 'token': token }, // 預設contentType ,預留token
      success(res) {

      },
      error(e) {
        logError('api', '請求介面出現問題', e)
      }
    }
    return Taro.request(option)
  },
複製程式碼

get方法

  get(url, data = '') {
    let option = { url, data }
    return this.baseOptions(option)
  },
複製程式碼

post 方法

增加了contentType 不同的後端框架會要求不同的請求頭部

  post: function (url, data, contentType) {
    let params = { url, data, contentType }
    return this.baseOptions(params, 'POST')
  }
複製程式碼

這樣我們就可以很方便在action裡面使用了

import api from '../service/api'
api.get('news/list', params)
複製程式碼

新增判斷狀態

2018-09-27-11-00-39

export const HTTP_STATUS = {
  SUCCESS: 200,
  CLIENT_ERROR: 400,
  AUTHENTICATE: 401,
  FORBIDDEN: 403,
  NOT_FOUND: 404,
  SERVER_ERROR: 500,
  BAD_GATEWAY: 502,
  SERVICE_UNAVAILABLE: 503,
  GATEWAY_TIMEOUT: 504
}
複製程式碼

配置

export const base = "https://api.github.com/repos/"
複製程式碼

增加異常錯誤logError日誌

export const logError = (name, action, info) => {
  if (!info) {
    info = 'empty'
  }
  try {
    let deviceInfo = wx.getSystemInfoSync() // 這替換成 taro的
    var device = JSON.stringify(deviceInfo)
  } catch (e) {
    console.error('not support getSystemInfoSync api', err.message)
  }
  let time = formatTime(new Date())
  console.error(time, name, action, info, device)
  // 如果使用了 第三方日誌自動上報
  // if (typeof action !== 'object') {
  // fundebug.notify(name, action, info)
  // }
  // fundebug.notifyError(info, { name, action, device, time })
  if (typeof info === 'object') {
    info = JSON.stringify(info)
  }
複製程式碼

配合使用

import { HTTP_STATUS } from '../const/status'
import { base } from './config'
import { logError } from '../utils'

  baseOptions(params, method = 'GET') {
    let { url, data } = params
    // let token = getApp().globalData.token
    // if (!token) login()
    console.log('params', params)
    let contentType = 'application/x-www-form-urlencoded'
    contentType = params.contentType || contentType
    const option = {
      isShowLoading: false,
      loadingText: '正在載入',
      url: base + url,
      data: data,
      method: method,
      header: { 'content-type': contentType, 'token': token },
      success(res) {
        if (res.statusCode === HTTP_STATUS.NOT_FOUND) {
          return logError('api', '請求資源不存在')
        } else if (res.statusCode === HTTP_STATUS.BAD_GATEWAY) {
          return logError('api', '服務端出現了問題')
        } else if (res.statusCode === HTTP_STATUS.FORBIDDEN) {
          return logError('api', '沒有許可權訪問')
        } else if (res.statusCode === HTTP_STATUS.SUCCESS) {
          return res.data
        }
      },
      error(e) {
        logError('api', '請求介面出現問題', e)
      }
    }
    return Taro.request(option)
  },
複製程式碼

最終版本

import Taro from '@tarojs/taro'
import { HTTP_STATUS } from '../const/status'
import { base } from './config'
import { logError } from '../utils'

const token = ''

export default {
  baseOptions(params, method = 'GET') {
    let { url, data } = params
    // let token = getApp().globalData.token
    // if (!token) login()
    console.log('params', params)
    let contentType = 'application/x-www-form-urlencoded'
    contentType = params.contentType || contentType
    const option = {
      isShowLoading: false,
      loadingText: '正在載入',
      url: base + url,
      data: data,
      method: method,
      header: { 'content-type': contentType, 'token': token },
      success(res) {
        if (res.statusCode === HTTP_STATUS.NOT_FOUND) {
          return logError('api', '請求資源不存在')
        } else if (res.statusCode === HTTP_STATUS.BAD_GATEWAY) {
          return logError('api', '服務端出現了問題')
        } else if (res.statusCode === HTTP_STATUS.FORBIDDEN) {
          return logError('api', '沒有許可權訪問')
        } else if (res.statusCode === HTTP_STATUS.SUCCESS) {
          return res.data
        }
      },
      error(e) {
        logError('api', '請求介面出現問題', e)
      }
    }
    return Taro.request(option)
  },
  get(url, data = '') {
    let option = { url, data }
    return this.baseOptions(option)
  },
  post: function (url, data, contentType) {
    let params = { url, data, contentType }
    return this.baseOptions(params, 'POST')
  }
}

複製程式碼

全部程式碼

如果能幫到你幫忙點個 star github.com/wsdo/taro-k…

專案目錄

2018-09-27-11-12-54

相關文章