http-request.ts
3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import axios 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 = null
public header = null
constructor(private baseUrl) {
this.header = { ...APP.header }
this.init()
}
/**初始化 */
init() {
let instance = axios.create({ baseURL: this.baseUrl, headers: this.header })
this.interceptors(instance)
this.instance = instance
}
/**绑定请求拦截器 */
interceptors(instance) {
// 请求
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 => {
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) {
return this.instance(options)
}
/**
* 可取消的请求,返回一个source对象对象。可通过 source.cancel(msg) 取消此请求
* @param {*} options
* @param {function} successCallback
* @param {function} errorCallback
*/
sourceRequest(options, successCallback, errorCallback) {
const source = 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) {
this.instance.defaults.headers.common[key] = value
}
/**
* 设置URL
* @param {string} url
*/
setBaseUrl(url) {
this.instance.defaults.baseURL = url
}
/**
* 处理响用体
* @param {response} res
*/
handleRespone(res) {
const { code, message, data } = res.data
switch (code) {
case 200: 1590
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() {
getStore().dispatch.user.reset()
getStore().dispatch.me.reset()
navigate('Login')
}
}
export default HttpRequest