Taro 封装request

3,135 阅读1分钟
  1. request.js
import Taro from '@tarojs/taro'
const cryptoJS = require('./CryptoJS.js')
const base64 = require('./enc-base64.js')
import { HTTP_STATUS } from './http_status'
const flag = xxxxx
const version = xxxxx
let appId = xxxxx
let secretKey = xxxxxxx
let host = xxxxxx
//看情况使用
const genkey = (method, service) => {
	var url = ''
	var timeStamp = Math.round(new Date().getTime() / 1000)
	var encodeResult = getContentStr(method, service, timeStamp)
	var uri = flag + ':' + timeStamp + ':' + encodeResult
	url = host + service + '/' + version + '/' + appId + '/' + uri
	// url = config.host + service
	return url
}
const getContentStr = (method, service, timeStamp) => {
	var content =
		flag +
		'\nappid=' +
		appId +
		'\nmethod=' +
		method +
		'\n' +
		'service=' +
		service +
		'\n' +
		'time=' +
		timeStamp +
		'\n' +
		'version=' +
		version +
		'\n'
	var hash = cryptoJS.HmacSHA1(content, secretKey)
	var encodeResult = hash.toString(cryptoJS.enc.Base64)
	return encodeURIComponent(encodeResult)
}
const customInterceptor = (chain) => {
    const requestParams = chain.requestParams
    return chain.proceed(requestParams).then((res) => {
        if (res.statusCode === HTTP_STATUS.NOT_FOUND) {
                return Promise.reject('请求资源不存在')
        } else if (res.statusCode === HTTP_STATUS.BAD_GATEWAY) {
                return Promise.reject('服务端出现了问题')
        } else if (res.statusCode === HTTP_STATUS.FORBIDDEN) {
                return Promise.reject('没有权限访问')
        } else if (res.statusCode === HTTP_STATUS.AUTHENTICATE) {
                return Promise.reject('需要鉴权')
        } else if (res.statusCode === HTTP_STATUS.SUCCESS) {
                if (res.data.code === 1) {
                        return res.data
                }
            }
        }
    })
}
Taro.addInterceptor(customInterceptor)
Taro.addInterceptor(Taro.interceptors.timeoutInterceptor)
const baseOptions = (params, method) => {
    let { url, data } = params
    let postUrl = genkey(method, url)
    let contentType = 'application/x-www-form-urlencoded'
    // let contentType = 'application/json;charset=UTF-8'
    contentType = params.contentType || contentType
    return (new Promise((resolve, reject) => {
            Taro.showLoading({
                    title: '加载中',
            })
            Taro.request({
                    url: postUrl,
                    data: data,
                    method: method,
                    timeout: 30000,
                    header: {
                            'content-type': contentType,
                    },
                    success: function (res) {
                            resolve(res.data)
                            Taro.hideLoading()
                    },
                    fail: function (err) {
                            Taro.hideLoading()
                            let msg = ''
                            if (!err.statusCode) {
                                    if (err.errMsg.includes('timeout')) {
                                            msg = '请求超时'
                                    }
                            } else {
                                    switch (err.statusCode) {
                                            case 500:
                                                    msg = '网络500错误'
                                                    break
                                            case 404:
                                                    msg = '未找到远程服务器'
                                                    break
                                            case 400:
                                                    msg = '数据异常'
                                                    break
                                            default:
                                                    msg = '请求出错,请重试'
                                                    break
                                    }
                            }

                            Taro.showModal({
                                    title: '提示',
                                    showCancel: false,
                                    content: msg,
                            })
                            reject(err)
                    },
            })
    }))
}
const get = (url, data, contentType) => {
	let option = { url, data, contentType }
	return baseOptions(option, 'GET')
}
const post = (url, data, contentType) => {
	let option = { url, data, contentType }
	return baseOptions(option, 'POST')
}

let request = {
	genkey: genkey,
	post: post,
	get: get,
}

export default request
  1. http_status.js
export const HTTP_STATUS = {
  SUCCESS: 200,
  CREATED: 201,
  ACCEPTED: 202,
  CLIENT_ERROR: 400,
  AUTHENTICATE: 401,
  FORBIDDEN: 403,
  NOT_FOUND: 404,
  SERVER_ERROR: 500,
  BAD_GATEWAY: 502,
  SERVICE_UNAVAILABLE: 503,
  GATEWAY_TIMEOUT: 504
}