/**
|
* http事件委托
|
*
|
* udData 说明
|
* udData.noloading 不需要请求
|
* udData.fullData 使用 reponse 返回的对象进行 success 回调 (jun_http.js)
|
* udData.nodomain 仅限于web端使用,不适用 baseUrl 前置(即当前网址根路径) (jun_http.js)
|
* udData.nokey 不需要mpToken参数
|
*/
|
|
import Login from './jun_login'
|
// import { MessageBox, Message, Loading } from 'element-ui'
|
import fn from './fn'
|
import resStatusCode from './jun_httpStatus'
|
// 过滤 html
|
function filterHtml (str) {
|
if (typeof str !== 'string') {
|
return str
|
}
|
return str.replace(/\n|\t|\s/g, '').replace(/<script\s?.+><\/script>/g, '').replace(/<[^>]+>/g, '')
|
}
|
|
/**
|
* 使用 element-ui loading service
|
*/
|
// let loadingInstance // 定义loading变量
|
// // 开始loading
|
// function startLoading(){
|
// loadingInstance = Loading.service({
|
// lock: true,
|
// text: '加载中...',
|
// background: 'rgba(255,255,255,0.7)',
|
// fullscreen: true,
|
// })
|
// }
|
// // 结束loading
|
// function endLoading(){
|
// loadingInstance && loadingInstance.close()
|
// }
|
|
// 开始loading
|
function startLoading(request_option){
|
//
|
// console.log(request_option.udData)
|
// request_option.udData && typeof request_option.udData.loading === 'function' && request_option.udData.loading()
|
typeof window.appLoading === 'function' && window.appLoading()
|
}
|
|
// 结束loading
|
function endLoading(request_option){
|
//
|
// request_option.udData && typeof request_option.udData.hideLoading === 'function' && request_option.udData.hideLoading()
|
typeof window.appHideLoading === 'function' && window.appHideLoading()
|
}
|
|
// 请求前处理参数 - get
|
function getChangeRequestOption (get_option) {
|
if (!get_option.udData || !get_option.udData.nokey) {
|
if (!get_option.params) {
|
get_option.params = {}
|
}
|
// 补充参数
|
// 需要 we_session
|
var we_session = fn.getLocalStorage('we_session')
|
if (we_session && we_session.we_session) {
|
get_option.params.key = we_session.we_session
|
get_option.params.mpToken = we_session.we_session
|
}
|
}
|
return get_option
|
}
|
// 请求前处理参数 - post
|
function postChangeRequestOption (post_option) {
|
if (!post_option.udData || !post_option.udData.nokey) {
|
if (!post_option.data) {
|
post_option.data = {}
|
}
|
// 补充参数
|
// 需要 we_session
|
var we_session = fn.getLocalStorage('we_session')
|
if (we_session && we_session.we_session) {
|
post_option.data.key = we_session.we_session
|
post_option.data.mpToken = we_session.we_session
|
}
|
}
|
return post_option
|
}
|
|
var httpEventCode = {
|
code200 (data) {
|
// console.log(data, 200)
|
},
|
code404 (data, url) {
|
// element-ui
|
// Message.error('无法访问接口,状态404:' + url)
|
},
|
code500 (data, url) {
|
// element-ui
|
// Message.error('请求失败,状态500:' + url)
|
}
|
}
|
|
var g_login_counter = 0 // 登录请求次数
|
const g_LOGIN_MAX = 10 // 最大请求次数
|
|
var g_flag_loading = false // 是否已经loading
|
var g_flag_login_requested = false // 是否正在请求登录
|
var g_login_result = null // 登录返回数据
|
var g_flag_config_requested = false // 其余配置请求
|
var g_config_result = null // 配置请求返回
|
// 请求前
|
function beforeRequest (res) {
|
// 开启loading
|
if (!g_flag_loading && (!res.request_option.udData || !res.request_option.udData.noLoading)) {
|
res.http_option.debug && console.log('jun_httpEvent beforeRequest loading')
|
// wx.showLoading({
|
// title: '加载中',
|
// mask: true
|
// })
|
// loading
|
startLoading(res.request_option)
|
g_flag_loading = true
|
}
|
|
// 重置登录请求标记
|
var we_session = fn.getLocalStorage('we_session')
|
if (we_session && we_session.we_session) {
|
g_flag_login_requested = false
|
}
|
}
|
|
// 请求后
|
function afterRequest (res) {
|
// console.log('请求后')
|
}
|
|
// 处理返回数据
|
// @return {Object} 处理过的数据
|
function successChangeData (res) {
|
return res
|
}
|
|
// 批量请求完成
|
function afterMultiRequests (request_option) {
|
// console.log("多个请求结束之后")
|
// 关闭loading
|
if (g_flag_loading) {
|
// wx.hideLoading()
|
endLoading(request_option)
|
g_flag_loading = false
|
}
|
}
|
|
function updateKey (res, key) {
|
// 更新 key 值
|
if (res.request_option.method === 'GET' && (!res.request_option.udData || !res.request_option.udData.nokey)) {
|
res.request_option.url = res.request_option.url.replace(/mpToken=[^&]*/g, `mpToken=${key}`)
|
}
|
if (res.request_option.method === 'POST' && (!res.request_option.udData || !res.request_option.udData.nokey)) {
|
res.request_option.data.mpToken = key
|
}
|
return res
|
}
|
|
// 模拟数据处理流程
|
function mockFlow (res) {
|
return new Promise(async (resolve, reject) => {
|
// 打印请求信息
|
res.http_option.debug && console.log('模拟请求', res.request_option)
|
|
var mockData = res.request_option.mockData || {code: 100, data: {}, message: 'success'}
|
|
// 打印返回信息
|
res.http_option.debug && console.log('模拟返回', {data: mockData})
|
res.http_option.debug && console.log('开始模拟等待800ms')
|
var timer = setTimeout(()=>{
|
clearTimeout(timer)
|
// 关闭loading
|
if (g_flag_loading) {
|
// wx.hideLoading()
|
endLoading(res.request_option)
|
g_flag_loading = false
|
}
|
res.http_option.debug && console.log('结束模拟等待800ms')
|
if (res.request_option.udData && res.request_option.fullData) {
|
resolve({data: mockData})
|
} else {
|
resolve(mockData)
|
}
|
}, 800)
|
})
|
}
|
|
// 请求前处理流程
|
function beforeFlow (res) {
|
return new Promise(async (resolve, reject) => {
|
// 预留请求前处理
|
// 设置为true,下次处理跳过 beforeFlow,避免死循环
|
res.request_option.skip_before_flow = true
|
// 再次请求
|
resolve(res.Request(res.request_option))
|
})
|
}
|
|
// 预留其余处理
|
function configRequest(){
|
return new Promise((resolve, reject) => {
|
resolve({})
|
})
|
}
|
|
// 登录处理
|
function appLogin (option={}) {
|
return new Promise((resolve, reject) => {
|
// Login.checkLogin({
|
// force: !!option.forceLogin,
|
// callback: (key)=>{
|
// resolve(key)
|
// }
|
// })
|
Login.toLongUrl()
|
})
|
}
|
|
// 请求后处理
|
function afterFlow (res) {
|
return new Promise((resolve, reject)=>{
|
var data = res.res.data
|
|
// 登录超时
|
if (
|
(data && data.res && data.res.status == 2)
|
|| (data && data.code == 603)
|
) {
|
res.http_option.debug && console.log('登录超时,需要重新登录', res.res)
|
// 登录超时,需要重新登录
|
// 清空we_session
|
// getApp().globalData.we_session = null
|
fn.removeLocalStorage('we_session')
|
resolve(retryLogin(res))
|
return
|
}
|
|
// status不为0
|
if (
|
(data && data.res && data.res.status != 0)
|
|| (data && data.code != 100)
|
) {
|
if (data.res) {
|
console.error('status不为0:' + (res.res.errMsg || ''), res.res)
|
// 弹出提示
|
// wx.showModal({
|
// title: '请求提示',
|
// content: data.res.errMsg || `请求有误,status=${data.res.status}`,
|
// confirmText: '确定',
|
// confirmColor: '#576B95',
|
// showCancel: false
|
// })
|
|
// element-ui
|
// Message.error(data.res.errMsg || `请求有误,status=${data.res.status}`)
|
|
// 根据status处理
|
if (typeof resStatusCode['status' + data.res.status] === 'function') {
|
resStatusCode['status' + data.res.status](data)
|
}
|
}
|
|
if (typeof data.code !== 'undefined') {
|
console.error('code不为100:' + data.code, data.msg, res.res)
|
}
|
|
reject(res.res)
|
return
|
}
|
|
|
// status为空
|
if (data && !data.res && typeof data.code === 'undefined') {
|
console.error('status为空', res.res)
|
let tips = ''
|
if (res.res.statusCode=='500') {
|
tips = '当前网络状态不佳,请稍后再试:statusCode=500;'
|
} else if (res.res.statusCode=='200') {
|
if (typeof res.data === 'string') {
|
tips = filterHtml(res.data)
|
}
|
if (typeof res.data === 'object') {
|
tips = filterHtml(JSON.stringify(res.data))
|
}
|
tips = '网络状况不佳,点击确定重试:statusCode=200;' + tips
|
} else {
|
tips = `连接服务器失败,点击确定重试:statusCode=${res.res.statusCode};`
|
}
|
// 请求提示
|
|
// 小程序
|
// wx.showModal({
|
// title: '请求提示',
|
// content: tips,
|
// confirmText: '确定',
|
// confirmColor: '#576B95',
|
// showCancel: false,
|
// success (res) {
|
// if (res.confirm) {
|
// // 点击确认后重新请求
|
// resolve(res.Request(res.request_option))
|
// }
|
// }
|
// })
|
|
// element-ui
|
// MessageBox.alert(tips, '网络提示', {
|
// confirmButtonText: '确定',
|
// type: 'error'
|
// }).then(()=>{
|
// resolve(res.Request(res.request_option))
|
// }).catch(()=>{
|
// // 点击取消
|
// })
|
return
|
}
|
|
// 打印返回信息
|
res.http_option.debug && console.log('返回', res.res)
|
if (res.request_option.udData) {
|
// 返回全部数据
|
if (res.request_option.udData.fullData === true) {
|
resolve(res.res)
|
}
|
}
|
g_login_counter && (g_login_counter = 0)
|
resolve(data)
|
})
|
}
|
|
// 重新登录
|
async function retryLogin (res) {
|
// 次数+1
|
g_login_counter++
|
return new Promise(async (resolve, reject) => {
|
// 等待登录
|
var login_result = await appLogin({forceLogin: true})
|
// 登录失败
|
if (!login_result && g_login_counter < g_LOGIN_MAX) {
|
// 2秒后重试
|
var timer = setTimeout(()=>{
|
clearTimeout(timer)
|
resolve(retryLogin(res))
|
}, 2000)
|
}
|
// 登录成功
|
if (login_result) {
|
// 更新key值
|
res = updateKey(res, login_result)
|
// 再次请求
|
resolve(res.Request(res.request_option))
|
}
|
})
|
}
|
|
export default {
|
httpEventCode,
|
|
getChangeRequestOption,
|
postChangeRequestOption,
|
successChangeData,
|
|
beforeRequest,
|
afterRequest,
|
afterMultiRequests,
|
|
mockFlow,
|
beforeFlow,
|
afterFlow,
|
}
|