/*** request 网络请求工具* @Doc: https://github.com/umijs/umi-request*/
import { clearAuthority } from '@/utils/authority';
import { getToken } from '@/services/authorityService';
import { router } from 'umi';
import { extend } from 'umi-request';
import F from '@/utils/locale';
import { notification } from 'antd';
import storage from '@/utils/storage';
import _ from 'lodash';
import JSONBig from 'json-bigint';
import { getJudgeValue } from '@/utils/common.utils';
import { getLocale } from 'umi/locale';
import { handleJsonBig } from '@/utils/untils';export const EMPTY_DATA = { success: true, data: [], total: 0 };const CODE_MESSAGE = {200: '服务器成功返回请求的数据。',201: '新建或修改数据成功。',202: '一个请求已经进入后台排队(异步任务)。',204: '删除数据成功。',400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',401: '用户没有权限(令牌、用户名、密码错误)。',403: '用户得到授权,但是访问是被禁止的。',404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',406: '请求的格式不可得。',410: '请求的资源被永久删除,且不会再得到的。',422: '当创建一个对象时,发生一个验证错误。',500: '服务器发生错误,请检查服务器。',502: '网关错误。',503: '服务不可用,服务器暂时过载或维护。',504: '网关超时。',
};
const CODE_MESSAGE_NEW = {...CODE_MESSAGE,400: '客户端传入参数的错误。',401: '接口传入的 Token 非法或者已过期。',403: '接口要访问的资源未得到授权,或服务端前置的数据不全。',404: '接口要访问的资源不存在。',405: '接口访问的 Method 不正确。',500: '服务端错误。',
};// 当错误信息是401的时候,跳转到GEELY SSO服务器登录
const backToLogin = () => {clearAuthority();if (storage.get('IS-HERO')) {window.location.href = '/user/login?hero';} else {window.location.href = SSO_REDIRECT;}
};// 异常处理程序
const errorHandler = error => {const { response = {}, data } = error || {};const { message } = data;const { status, url } = response;let description = message;const service = url.match(/\/glotaone-([a-zA-Z]*)\//)[1] || null;if (status === 401) {backToLogin();return;}if (service) {if (/^W.*$/.test(data.code)) {const localeId = `common_error.${service.toLowerCase()}.${data.code}`;const errMsg = F({ id: localeId });notification.warning({message: getJudgeValue(errMsg === localeId, description, errMsg),});return;}if (/^E.*$/.test(data.code)) {const localeId = `common_error.request.${data.code}`;const errMsg = F({ id: localeId });notification.error({message: getJudgeValue(errMsg === localeId, description, errMsg),});return;}}if (!data.code) {if (_.isString(data)) {description = data;notification.error({message: `${F({ id: 'app.request.error' })}`,description,});} else {notification.error({message: `${F({ id: 'app.request.error' })} ${status}: ${url}`,description,});}} else {notification.error({description,});}
};// blob流处理
const handleBlob = res => {const disposition =res.headers.get('Content-disposition') || res.headers.get('content-disposition');if (disposition) {const filename =disposition.indexOf('=') > -1? decodeURI(disposition.substring(disposition.indexOf('=') + 1)).replace('utf-8\'\'', ''): null;return {filename,promise: res.blob(),};}return res;
};let selectedLang = getLocale();
if (selectedLang === 'zh-CN') {selectedLang = 'cn';
} else {selectedLang = 'en';
}
// 配置request请求时的默认参数
const request = extend({headers: {Accept: 'application/json',language: selectedLang,},errorHandler, // 默认错误处理credentials: 'include', // 默认请求是否带上cookieprefix: '/mgapi',
});// request 拦截器
request.interceptors.request.use((url, options) => {// 新接口预处理page、size等字段const { headers, withToken = true } = options;if (withToken) {headers.Authorization = getToken();}return {url,options,headers,};
});// response 拦截器
request.interceptors.response.use(async res => {try {const { status, url } = res;if (status === 401) {backToLogin();return false;}// token过期跳到登录页面const json = await res.clone().json();if (json.status === '40101' || json.code === 10114) {notification.error({ message: json.msg });const isHero = storage.get('IS-HERO');clearAuthority();window.location.href = isHero ? '/user/login?hero' : SSO_REDIRECT;}if (json.status === '40103') {notification.error({ message: F({ id: 'common_error.request.40103' }) });}if (status !== 200) {const message = (await res.clone().text()) || CODE_MESSAGE_NEW[status];notification.error({message: `${status}: ${message}`,description: url,});}// 非json类型不进行BigInt处理if (res.headers.get('content-type').indexOf('application/json') > -1 ||res.headers.get('Content-Type').indexOf('application/json') > -1) {switch (json.code) {case '0':case 0:break;case 'E100001':router.push('/401');errorHandler({ response: res.clone(), data: json });break;case 'E100002':backToLogin();errorHandler({ response: res.clone(), data: json });break;default:errorHandler({ response: res.clone(), data: json });return res;}// 处理BigIntconst jsonBig = JSONBig.parse(await res.clone().text());return handleJsonBig(jsonBig);}return res;} catch (e) {return handleBlob(res);}
});export default request;

request 网络请求工具相关推荐

  1. 基于HttpURLConnection 网络请求工具类的封装

    HttpUtils: /*** Created by xiaoyehai on 2018/5/21 0021.*/public class HttpUtils {//线程池private static ...

  2. Okhttp网络请求工具介绍

    1.Okhttp请求流程: Okhttp内部的大致请求流程图如下所示: 使用方式: public class OkHttpUtils {private static String TAG = &quo ...

  3. java okhttp3 工具类,Retrofit+okhttp+Rxjava网络请求工具类

    1.BaseApis接口封装请求方式 package com.example.wdshop.network; import java.util.Map; import okhttp3.Response ...

  4. uni-app - uni.request 网络请求超时时间配置(全局超时时间配置)

    前言 官方配置文档(networktimeout):https://uniapp.dcloud.io/collocation/manifest?id=networktimeout 有时候,我们需要对接 ...

  5. Ant Design Pro 网络请求,视图绑定model并且渲染到页面 umi-request

    封装网络请求,在service中新建接口,在model调用service,在视图绑定model并且得到网络请求的回调函数,获取网络请求的数据渲染到页面. 网络请求数据走向: 1.在utils/requ ...

  6. Retrofit网络请求框架使用简析——Android网络请求框架(四)

    题记:-- 很累,累到想要放弃,但是放弃之后将会是一无所有,又不能放弃, 唯有坚持,唯有给自忆打气,才能更勇敢的走下去,因为无路可退,只能前行, 时光一去不复返,每一天都不可追回,所以要更珍惜每一存光 ...

  7. Volley网络请求框架简析——Android网络请求框架(三)

    题记-- 人来到这个世界上,只有两件事情,生与死, 一件事完了,另一件事还急什么? 有缘而来,无缘而去, 识自本心,见自本性 不起妄缘,无心无为 自由自在,动静自如 冷暖自知,则是修行 1.初始化一个 ...

  8. afn访问本地html,Swift利用AFN实现封装网络请求详解

    前言 相信大家都知道,我们一般在一个项目中,网络请求都封装成一个单例,以确保整个项目的网络请求 Session 是同一个. 单例模式定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供,下面话不 ...

  9. 微信小程token_微信小程序-携带Token无感知登陆的网络请求方案

    去年写了一个网络请求工具封装的文章 微信小程序~ 网络请求工具的封装 当时没有考虑登陆须要服务器token验证web token 是什么? token 顾名思义就是令牌,也就是一种身份标志.用于和服务 ...

最新文章

  1. 利用SeekFree的核心板调试MM32F3277的ISP功能
  2. 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
  3. 《iOS 9应用开发入门经典(第7版)》——第1章,第1.6节小结
  4. 笔记-高项案例题-2014年下-计算题
  5. lesson7 集合set
  6. 【Linux系统编程】进程概述和进程号
  7. GDPR到底是如何影响机器学习的?
  8. fcm模糊聚类matlab实例_模糊控制
  9. MyBatis框架的使用及源码分析(三) 配置篇 Configuration
  10. 凸优化第四章凸优化问题 4.4二次优化问题
  11. 《信号与系统学习笔记》—线性反馈系统(二)
  12. 静态路由 直连路由 拓扑
  13. Feign报错java.lang.NoSuchFieldError: MULTIPART_RELATED
  14. 将网页,网站(HTML,php,css)上传浏览器,实现输入网址即可访问(保姆级教学)
  15. 网格边缘试探--服务网格的探索与实践
  16. 全球及中国丝蛋白行业研究及十四五规划分析报告
  17. STC8PMW波输出
  18. swiper 弹出图片_结合swiper使用图片懒加载
  19. LC振荡电路以及考虑寄生参数时MOS管开通关断分析
  20. fedora17下nvidia双显卡闭源驱动的安装

热门文章

  1. android 新浪财经截屏分享,QQ浏览器HD 2.2:独创截屏分享至微博
  2. 计算机火线接口指的,[声卡midi接口怎么用]火线接口声卡和midi接口声卡
  3. C#与.NET程序员面试宝典
  4. python编译方法
  5. 2022年城市商品房销售价格趋势,房价是涨还是跌?
  6. Maya2015安装配置和学习
  7. 像素大厨可以生成html吗,PxCook(像素大厨)
  8. 清华北大计算机考研报录比,2020年考研,清华北大报考人数对比,占考研总人数14%...
  9. 窗体全屏 隐藏任务栏与菜单栏
  10. 专利申请成功后拥有哪五项权利?