http-request.ts 3.37 KB
import axios, { AxiosInstance, AxiosResponse, CancelTokenSource } from 'axios'
import { APP } from '../config'
import { getStore } from '../store/context'
import { navigate } from '../router/ref'
import { ModalManager } from 'react-native-mb-ui'

class HttpRequest {
    public instance: AxiosInstance = null
    public header = null
    constructor(private baseUrl) {
        this.header = { ...APP.header }
        this.init()
    }
    /** 初始化 */
    init(): void {
        const instance = axios.create({ baseURL: this.baseUrl, headers: this.header })
        this.interceptors(instance)
        this.instance = instance
    }

    /** 绑定请求拦截器 */
    interceptors(instance): void {
        // 请求
        instance.interceptors.request.use(config => {
            return config
        }, error => {
            // if (process.env.NODE_ENV === 'development') console.warn(error)
            return Promise.reject(error)
        })

        // 响应
        instance.interceptors.response.use(res => {

            return this.handleRespone(res)

        }, error => {
            /* eslint-disable no-console */
            if (process.env.NODE_ENV === 'development') console.warn(error)

            return Promise.reject(error.response ? `发生错误,错误代码:${error.response.status};详情:${error.response.message || ''}` : error.message + "")
        })

    }

    /** 请求 */
    async request(options): Promise<AxiosResponse<unknown>> {
        return this.instance(options)
    }

    /**
     * 可取消的请求,返回一个source对象对象。可通过 source.cancel(msg) 取消此请求
     * @param {*} options
     * @param {function} successCallback
     * @param {function} errorCallback
     */
    sourceRequest(options, successCallback, errorCallback): CancelTokenSource {
        const source: CancelTokenSource = axios.CancelToken.source()
        options = Object.assign(options, { cancelToken: source.token })
        this.instance(options)
            .then(successCallback)
            .catch(errorCallback)
        return source
    }


    /**
     * 设置请求头
     * @param {string} key
     * @param {any} value
     */
    setHeader(key, value): void {
        this.instance.defaults.headers.common[key] = value
    }

    /**
     * 设置URL
     * @param {string} url
     */
    setBaseUrl(url): void {
        this.instance.defaults.baseURL = url
    }

    /**
     * 处理响用体
     * @param {response} res
     */
    handleRespone(res): Promise<string| unknown> {
        const { code, message, data } = res.data
        switch (code) {
            case 200:
                return data
            case 401:
                ModalManager.alert({ title: '提示', content: '登陆状态失效,请重新登陆' })
                this.resetState()
                return Promise.reject(`未登录或登录状态已过期 错误代码: ${code}`)
            case 403:
                return Promise.reject(`无权限使用此功能 错误代码: ${code};`)
            default:
                if (process.env.NODE_ENV === 'development') console.warn(JSON.stringify(res.config))
                return Promise.reject(`${message || '未知原因'} 错误代码: ${code}`)
        }
    }

    resetState(): void {
        getStore().dispatch.user.reset()
        getStore().dispatch.me.reset()
        navigate('Login')
    }
}

export default HttpRequest