import fetch from 'dva/fetch' import { message } from 'antd' import MD5 from 'md5' import queryString from 'query-string' import config from '../config' import { history } from './history' import storage from './storage' export function request(url, options, onlyData, requestKey, onException) { return fetch( config.serviceHost('api/' + url), options || {} ).then(response => { // 登陆过期 if (response.status === 401) { window.localStorage.removeItem('accessToken') history.replace({ pathname: '/login' }) throw new Error('token过期') } requestKey && window.localStorage.removeItem(requestKey) return response.json() }).then(data => { data.IsSuccessful !== undefined && !data.IsSuccessful && message.error(data.ErrorMessage) return onlyData ? data.Data : data }).catch(err => { requestKey && window.localStorage.removeItem(requestKey) onException instanceof Function && onException(err) throw err; // 重新抛出错误,确保错误被正确传播 }) } /** * 获取请求 headers * @param {*} url * @param {*} type * @param {*} isIgnoreTenant * @returns */ export function getRequestHeaders(url, type = 'post', data, isIgnoreTenant) { // 请求参数 const addHeader = 'Bearer ' + storage('lacal').getItem('accessToken').val const userId = storage('lacal').getItem('userid').val if (!userId) { history.replace({ pathname: '/login' }) } const user = storage('lacal').getItem('loginUserVerify').val const RootOrgId = storage('lacal').getItem('RootOrgId').val const orgId = storage('lacal').getItem('webOrgId').val const depId = storage('lacal').getItem('departmentId').val const mineType = storage('lacal').getItem('MineType').val const DataRule = storage('lacal').getItem('DataRule').val const headers = { 'Content-Type': type === 'post' ? 'application/json' : 'application/x-www-form-urlencoded', Authorization: addHeader, userid: userId, username: user && user.username ? user.username : '', departmentId: depId, MineType: mineType, RootOrgId, orgId, DataRule } // 非 OP 路径接口,header 需要添加 Tenant const Tenant = storage('lacal').getItem('Tenant').val if (url.indexOf('PF/Login/Login') !== -1) { // Login接口使用最新的Tenant、Orgid、userid、Username值 const latestTenant = storage('lacal').getItem('Tenant').val const latestOrgid = storage('lacal').getItem('Orgid').val const latestUserid = storage('lacal').getItem('Userid').val const latestUsername = storage('lacal').getItem('Username').val if (latestTenant) { headers.Tenant = latestTenant } if (latestOrgid) { // 覆盖原有的orgId字段,使用最新值 headers.orgId = latestOrgid } if (latestUserid) { // 覆盖原有的userid字段,使用最新值 headers.userid = latestUserid } if (latestUsername) { // 覆盖原有的username字段,使用最新值 headers.username = latestUsername } } else if (url.indexOf('OP') != 0 && !isIgnoreTenant) { headers.Tenant = Tenant } //wyw if (Tenant && Tenant == '003' && data && data.Parameter22 && data.Parameter22.length > 20) { //总公司 Parameter22 存入子公司的ORG_ID 自动切换数据库链接 headers.Tenant = data.Parameter22.substring(0, 3) } return headers } /** * post 请求 * @param {*} url * @param {*} data * @param {*} onlyData * @param {*} ignoreThrottle * @param {*} onException * @param {*} isIgnoreTenant * @returns */ export function httpPost(url, data, onlyData = true, ignoreThrottle, onException, isIgnoreTenant) { //const DataRule = storage('lacal').getItem('DataRule').val const OrgRule = storage('lacal').getItem('OrgRule').val // 与 isIgnoreTenant 相关配套的逻辑 const extraData = isIgnoreTenant ? { OrgId: '', IgnoreOrgRule: true } : {} //const dataStr = JSON.stringify(Object.assign({}, data, { DataRule, OrgRule, ...extraData })) const dataStr = JSON.stringify(Object.assign({}, data, { OrgRule, ...extraData })) // 请求节流 const requestKey = url + '_' + MD5(dataStr) + '_requestKey' const loaded = storage('lacal').getItem(requestKey).val if (loaded && !ignoreThrottle) return null storage('lacal').setItem(requestKey, true) // 发起请求 return request(url, { method: 'POST', headers: getRequestHeaders(url, 'post', data, isIgnoreTenant), body: dataStr, }, onlyData, requestKey, onException) } /** * get 请求 * @param {*} url * @param {*} data * @param {*} onlyData * @param {*} onException * @returns */ export function httpGet(url, data, onlyData = true, onException) { const formParams = queryString.stringify(data) const searchMark = url.indexOf('?') !== -1 const formUrl = `${url}${searchMark ? '&' : '?'}${formParams}` url = formParams ? formUrl : url return request(url, { method: 'GET', headers: getRequestHeaders(url, 'get', data), }, onlyData, null, onException) }