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, }); }