FetchRequest.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import Auth from "@/api/Auth";
  2. import VimConfig from "@/config/VimConfig";
  3. import MessageUtils from "@/utils/MessageUtils";
  4. /**
  5. * 请求类,支持无感刷新token
  6. * @author
  7. */
  8. class FetchRequest {
  9. private static instance: FetchRequest;
  10. private constructor() {
  11. }
  12. /**
  13. * 单例构造方法,构造一个广为人知的接口,供用户对该类进行实例化
  14. * @returns {FetchRequest}
  15. */
  16. static getInstance() {
  17. if (!this.instance) {
  18. this.instance = new FetchRequest();
  19. }
  20. return this.instance;
  21. }
  22. /**
  23. * 请求方法
  24. * @param url 请求路径
  25. * @param params 参数
  26. * @param method 方法
  27. * @param isNeedToken 是否需要token
  28. */
  29. request = (
  30. url: string,
  31. params: string,
  32. method: string,
  33. isNeedToken = false
  34. ) => {
  35. const header: HeadersInit = {
  36. Accept: "application/json",
  37. "Content-Type": "application/json",
  38. };
  39. const token = Auth.getToken();
  40. if (isNeedToken && token) {
  41. header.Authorization = "Bearer " + token;
  42. }
  43. const config: RequestInit = {
  44. method: method,
  45. mode: "cors",
  46. headers: header,
  47. };
  48. if (method !== "GET") {
  49. config.body = params;
  50. }
  51. return this.fetch(this.getHost() + url, config)
  52. .then((response: any) => {
  53. return this.check(response);
  54. });
  55. };
  56. fetch = (url: string, config: RequestInit): Promise<any> => {
  57. return new Promise((resolve, reject) => {
  58. // @ts-ignore
  59. uni.request({
  60. url: url,
  61. method: config.method,
  62. data: config.body,
  63. sslVerify:false,
  64. header: config.headers,
  65. success(res) {
  66. resolve(res)
  67. },
  68. fail(err) {
  69. MessageUtils.error('无法链接网络');
  70. reject(err)
  71. }
  72. })
  73. })
  74. }
  75. /**
  76. * 检查请求返回值,如果token失效,执行刷新方法
  77. * @param response 请求响应数据
  78. */
  79. check = (response: any) => {
  80. //token 失效
  81. if (response.statusCode === 200) {
  82. let res = response.data;
  83. if (res.code === 401) {
  84. Auth.logout()
  85. } else if (res.code !== 200) {
  86. MessageUtils.error(res.msg)
  87. return Promise.reject(res);
  88. } else {
  89. return Promise.resolve(res);
  90. }
  91. } else {
  92. MessageUtils.error("请求出错,状态码:" + response.statusCode)
  93. return Promise.reject("请求出错");
  94. }
  95. };
  96. /**
  97. * 获取有效的ip
  98. */
  99. getEffectiveIp = (): string => {
  100. return VimConfig.host;
  101. };
  102. getHost = (): string => {
  103. return `${VimConfig.httProtocol}://${VimConfig.host}:${VimConfig.httPort}`
  104. };
  105. // 有些 api 并不需要用户授权使用,则无需携带 access_token;默认不携带,需要传则设置第三个参数为 true
  106. get = (url: string, isNeedToken = false) => {
  107. return this.request(url, "", "GET", isNeedToken);
  108. };
  109. post = (url: string, params: string, isNeedToken = false) => {
  110. return this.request(url, params, "POST", isNeedToken);
  111. };
  112. put = (url: string, params: string, isNeedToken = false) => {
  113. return this.request(url, params, "PUT", isNeedToken);
  114. };
  115. del = (url: string, params: string, isNeedToken = false) => {
  116. return this.request(url, params, "DELETE", isNeedToken);
  117. };
  118. patch = (url: string, params: string, isNeedToken = false) => {
  119. return this.request(url, params, "PATCH", isNeedToken);
  120. };
  121. }
  122. export default FetchRequest.getInstance();