react+umi发送请求request初始配置及使用

我们用的是umi+react ,自带了封装好的request,使用起来很方便,只需要简单设置下就可以.

1.设置

// 请求token
const getToken = async (url, forceLogin) => {
  const token = localStorage.getItem(`tokens`);
  if (!token || forceLogin) {
    if (REACT_ENV !== "production") {
      // 开发环境,自动登录
      const userInfo: LoginParamsType = {
        username: "用户名",
        password: "密码"
       
      }

      // 如果首次没有token或者登录失效且不是登录接口,那么就请求登录接口
      if (url && url.indexOf(/sso/auth/token) == -1 && !num) {
        num++;
        const response = await fakeAccountLogin(userInfo);
        const { code, data, msg } = response || {}
        if (code == 0) {
          localStorage.clear()
          localStorage.setItem(`dh-authority`, JSON.stringify(data));
          window.location.reload();
        }
      }
    } else {
      // 生产环境登录失效跳转到登录页面,由于是嵌套项目,需要通过top.window.postMessage跳转
      top.window.postMessage(
        {
          url: `/user/login`,
        },
        location.origin
      );
    }
  }

}
export const request: RequestConfig = {
  errorHandler: (error: any) => {
    const { response, data } = error;
    if (response && response.status) {
      if (!hasTokenError) {
        if (response.status === 401) {
          hasTokenError = true;
          getToken(response.url, true)
        }
        message.destroy()
        message.error(Service Unavailable)
      }
      return response
    }
    if (!response && !data) {
      message.error(出错啦...)
    } else if (data) {
      message.error(data?.errMsg || data?.msg)
    }
  },
  requestInterceptors: [requestInterceptor],
  responseInterceptors: [responseInterceptors]
};
const requestInterceptor = async (url, options) => {
  hasTokenError = false
  getToken(url, false);

  const tokens = getAuthority(tokens) || 
  if (tokens) {
    const headers = {
      token: tokens?.accessToken,
      Content-Type: application/json,
      Accept: application/json,
    }
    return {
      url: url,
      options: { ...options, headers: headers },
    }
  } else {
   message.error(出错啦!)
  }
};
const responseInterceptors = async (response: Response, options: RequestOptionsInit) => {
  let result
  
  if (options.responseType === blob) {
    return response
  }
  const data = await response.clone().json()
  result = response
  if (response.ok && data?.code !== 0 && data?.code !== 0 && options.url !== /api/else/check_stock) {
    result = response
    message.error(data.errMsg || data.msg || data.message)
    // 统一处理报错
  }
  return result
}

2.使用

import { ENV_URL } from @/utils/env;
let url = /api/
import { request } from umi;

export async function getStocks(params?: any): Promise<any> {
  return request(`${url}research/stock/stock_list`, {
    method: post,
    data: params,
  })
}

export async function getInfo(params: any): Promise<any> {
  return request(`${url}credit/company/baseInfo`, {
    method: get,
    params,
  });
}
经验分享 程序员 微信小程序 职场和发展