request.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. import env from '../config.js'
  2. // import NProgress from 'nprogress'
  3. // import 'nprogress/nprogress.css'
  4. import store from '../../store/index.js'
  5. const TAG_NAME="REQUEST REQUEST.JS";
  6. import Tools from '../tools.js';
  7. export default class Request {
  8. config = {
  9. baseUrl: env.consoleBaseUrl,
  10. header: {
  11. 'content-type': 'application/x-www-form-urlencoded',
  12. // 'content-type': 'application/json',
  13. // 'platform': uni.getStorageSync('platform'),
  14. },
  15. method: 'GET',
  16. dataType: 'json',
  17. // #ifndef MP-ALIPAY || APP-PLUS
  18. responseType: 'text',
  19. // #endif
  20. custom: {},
  21. // #ifdef MP-ALIPAY
  22. timeout: 30000,
  23. // #endif
  24. // #ifdef APP-PLUS
  25. sslVerify: false
  26. // #endif
  27. }
  28. static posUrl(url) { /* 判断url是否为绝对路径 */
  29. return /(http|https):\/\/([\w.]+\/?)\S*/.test(url)
  30. }
  31. // static addQueryString(params) {
  32. // let paramsData = ''
  33. // Object.keys(params).forEach(function(key) {
  34. // paramsData += key + '=' + encodeURIComponent(params[key]) + '&'
  35. // })
  36. // return paramsData.substring(0, paramsData.length - 1)
  37. // }
  38. /**
  39. * @property {Function} request 请求拦截器
  40. * @property {Function} response 响应拦截器
  41. * @type {{request: Request.interceptor.request, response: Request.interceptor.response}}
  42. */
  43. interceptor = {
  44. /**
  45. * @param {Request~requestCallback} cb - 请求之前拦截,接收一个函数(config, cancel)=> {return config}。第一个参数为全局config,第二个参数为函数,调用则取消本次请求。
  46. */
  47. request: (cb) => {
  48. if (cb) {
  49. this.requestBeforeFun = cb
  50. }
  51. },
  52. /**
  53. * @param {Request~responseCallback} cb 响应拦截器,对响应数据做点什么
  54. * @param {Request~responseErrCallback} ecb 响应拦截器,对响应错误做点什么
  55. */
  56. response: (cb, ecb) => {
  57. if (cb && ecb) {
  58. this.requestComFun = cb
  59. this.requestComFail = ecb
  60. }
  61. }
  62. }
  63. requestBeforeFun(config) {
  64. return config
  65. }
  66. requestComFun(response) {
  67. return response
  68. }
  69. requestComFail(response) {
  70. return response
  71. }
  72. /**
  73. * 自定义验证器,如果返回true 则进入响应拦截器的响应成功函数(resolve),否则进入响应拦截器的响应错误函数(reject)
  74. * @param { Number } statusCode - 请求响应体statusCode(只读)
  75. * @return { Boolean } 如果为true,则 resolve, 否则 reject
  76. */
  77. validateStatus(statusCode) {
  78. return statusCode === 200
  79. }
  80. /**
  81. * @Function
  82. * @param {Request~setConfigCallback} f - 设置全局默认配置
  83. */
  84. setConfig(f) {
  85. this.config = f(this.config)
  86. }
  87. /**
  88. * @Function
  89. * @param {Object} options - 请求配置项
  90. * @prop {String} options.url - 请求路径
  91. * @prop {Object} options.data - 请求参数
  92. * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型
  93. * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse
  94. * @prop {Object} [options.header = config.header] - 请求header
  95. * @prop {Object} [options.method = config.method] - 请求方法
  96. * @returns {Promise<unknown>}
  97. */
  98. request(options = {}) {
  99. options.baseUrl = this.config.baseUrl
  100. options.dataType = options.dataType || this.config.dataType
  101. // #ifndef MP-ALIPAY || APP-PLUS
  102. options.responseType = options.responseType || this.config.responseType
  103. // #endif
  104. // #ifdef MP-ALIPAY
  105. options.timeout = options.timeout || this.config.timeout
  106. // #endif
  107. options.url = options.url || ''
  108. options.data = options.data || {}
  109. options.params = options.params || {}
  110. options.header = options.header || this.config.header
  111. options.method = options.method || this.config.method
  112. options.custom = { ...this.config.custom,
  113. ...(options.custom || {})
  114. }
  115. options.isNprogress = options.isNprogress || false
  116. // #ifdef APP-PLUS
  117. options.sslVerify = options.sslVerify === undefined ? this.config.sslVerify : options.sslVerify
  118. // #endif
  119. // uni.showToast({
  120. // icon: "loading",
  121. // image: "/static/imgs//logo/logo.gif"
  122. // })
  123. return new Promise((resolve, reject) => {
  124. let next = true
  125. let handleRe = {}
  126. options.complete = (response) => {
  127. if(handleRe.isNprogress) {
  128. // console.log('complete 支付成功 关闭弹窗~~',handleRe.isNprogress);
  129. uni.hideLoading();
  130. }
  131. response.config = handleRe
  132. if (this.validateStatus(response.statusCode)) { // 成功
  133. response = this.requestComFun(response)
  134. const data = response.data;
  135. // const errLoginCode = ['100000','100001','100002','100003','100004'];
  136. // if(data && data.code && errLoginCode.includes(data.code)){
  137. // const pages = getCurrentPages()
  138. // if(pages.length > 1 && pages[pages.length - 1].route== 'pages/index/login'){
  139. // //解决同时多个请求,都跳登录页情况
  140. // reject(TAG_NAME,'已在登录页,无需在次进入')
  141. // return;
  142. // }
  143. // console.log(TAG_NAME,options.url,'重新登录~')
  144. // uni.removeStorageSync('token')
  145. // setTimeout(()=>{
  146. // //已有提示
  147. // uni.redirectTo({
  148. // url:'/pages/index/login'
  149. // })
  150. // },1200)
  151. // }
  152. if (data.code !== 1) { // 服务端返回的状态码不等于200,则reject()
  153. uni.showToast({
  154. title: data.msg || '请求出错,稍后重试',
  155. icon: 'none',
  156. duration: 2000,
  157. mask: true
  158. });
  159. reject(response)
  160. }else{
  161. resolve(data)
  162. }
  163. }else {
  164. response = this.requestComFail(response)
  165. reject(response)
  166. }
  167. }
  168. //type = 1 reject; type = 2 有缓存resolve,request是否向下进行
  169. const cancel = (msg = 'handle cancel',data={},type=1, config = options) => {
  170. const obj = {
  171. msg: msg,
  172. data,
  173. config: config
  174. }
  175. type == 1 ? reject(obj) : resolve(data); //外层直接取res.code;
  176. if(config.isNprogress) uni.hideLoading(); //store.commit('loading/HIDE')
  177. next = false
  178. }
  179. handleRe = { ...this.requestBeforeFun(options, cancel)}
  180. const _config = { ...handleRe}
  181. // console.log('_config---', next, _config);
  182. if (!next) return;
  183. delete _config.custom
  184. if(_config.isNprogress) uni.showLoading({})
  185. let mergeUrl = Request.posUrl(_config.url) ? _config.url : (_config.baseUrl + _config.url)
  186. // 仅使用_config.data,未使用_config.params,且data内要添加token
  187. // if (JSON.stringify(_config.params) !== '{}') {
  188. // const paramsH = Request.addQueryString(_config.params);
  189. // mergeUrl += mergeUrl.indexOf('?') === -1 ? `?${paramsH}` : `&${paramsH}`
  190. // }
  191. _config.url = mergeUrl
  192. uni.request(_config)
  193. })
  194. }
  195. get(url, options = {}) {
  196. return this.request({
  197. url,
  198. method: 'GET',
  199. ...options
  200. })
  201. }
  202. post(url, data, options = {}) {
  203. return this.request({
  204. url,
  205. data,
  206. method: 'POST',
  207. ...options
  208. })
  209. }
  210. // upload(url, {
  211. // // #ifdef APP-PLUS
  212. // files,
  213. // // #endif
  214. // // #ifdef MP-ALIPAY
  215. // fileType,
  216. // // #endif
  217. // filePath,
  218. // name,
  219. // header,
  220. // formData,
  221. // custom
  222. // }) {
  223. // return new Promise((resolve, reject) => {
  224. // let next = true
  225. // let handleRe = {}
  226. // const globalHeader = { ...this.config.header
  227. // }
  228. // delete globalHeader['content-type']
  229. // const pubConfig = {
  230. // baseUrl: this.config.baseUrl,
  231. // url,
  232. // // #ifdef APP-PLUS
  233. // files,
  234. // // #endif
  235. // // #ifdef MP-ALIPAY
  236. // fileType,
  237. // // #endif
  238. // filePath,
  239. // method: 'UPLOAD',
  240. // name,
  241. // header: header || globalHeader,
  242. // formData,
  243. // custom: { ...this.config.custom,
  244. // ...(custom || {})
  245. // },
  246. // complete: (response) => {
  247. // response.config = handleRe
  248. // if (response.statusCode === 200) { // 成功
  249. // response = this.requestComFun(response)
  250. // resolve(response)
  251. // } else {
  252. // response = this.requestComFail(response)
  253. // reject(response)
  254. // }
  255. // }
  256. // }
  257. // const cancel = (t = 'handle cancel', config = pubConfig) => {
  258. // const err = {
  259. // errMsg: t,
  260. // config: config
  261. // }
  262. // reject(err)
  263. // next = false
  264. // }
  265. // handleRe = { ...this.requestBeforeFun(pubConfig, cancel)
  266. // }
  267. // const _config = { ...handleRe
  268. // }
  269. // if (!next) return
  270. // delete _config.custom
  271. // _config.url = Request.posUrl(_config.url) ? _config.url : (_config.baseUrl + _config.url)
  272. // uni.uploadFile(_config)
  273. // })
  274. // }
  275. }
  276. /**
  277. * setConfig回调
  278. * @return {Object} - 返回操作后的config
  279. * @callback Request~setConfigCallback
  280. * @param {Object} config - 全局默认config
  281. */
  282. /**
  283. * 请求拦截器回调
  284. * @return {Object} - 返回操作后的config
  285. * @callback Request~requestCallback
  286. * @param {Object} config - 全局config
  287. * @param {Function} [cancel] - 取消请求钩子,调用会取消本次请求
  288. */
  289. /**
  290. * 响应拦截器回调
  291. * @return {Object} - 返回操作后的response
  292. * @callback Request~responseCallback
  293. * @param {Object} response - 请求结果 response
  294. */
  295. /**
  296. * 响应错误拦截器回调
  297. * @return {Object} - 返回操作后的response
  298. * @callback Request~responseErrCallback
  299. * @param {Object} response - 请求结果 response
  300. */