基础概念

在 umi 项目中并没有规定一定要使用某种 http 请求方式,我们可以根据实际项目,选择自己最熟悉和服务端交互最优的 http 请求方式,一般项目中我们比较常用的就是 fetch 和 axios ,这两者的优缺点比较,可以查阅其他资料,但是无论你选择哪一种,在你需要更换成另一种时,只需要修改几行代码,因为它们在使用上,只有一点点参数结构的差异。
在ant design Pro中直接使用了umi-request,我们可以通过request.tx对请求进行统一的拦截和过滤处理,request.ts所在目录:/src/utils/request.ts
引入umi-request:

  1. import { extend } from 'umi-request';

异常处理程序

  1. /** 异常处理程序 */
  2. const errorHandler = (error: { response: Response }): Response => {
  3. const { response } = error;
  4. if (response && response.status) {
  5. const errorText = codeMessage[response.status] || response.statusText;
  6. const { status, url } = response;
  7. notification.error({
  8. message: `请求错误 ${status}: ${url}`,
  9. description: errorText,
  10. });
  11. } else if (!response) {
  12. notification.error({
  13. description: '您的网络发生异常,无法连接服务器',
  14. message: '网络异常',
  15. });
  16. }
  17. return response;
  18. };

配置request请求时的默认参数

  1. /** 配置request请求时的默认参数 */
  2. const request = extend({
  3. prefix: "/api",
  4. // baseURL: process.env.VUE_APP_API_BASE_URL,
  5. errorHandler, // 默认错误处理
  6. credentials: 'include', // 默认请求是否带上cookie
  7. timeout: requestTimeOut,
  8. responseType: 'json',
  9. });

请求拦截器

  1. request.interceptors.request.use(async (url, options) => {
  2. const headers = options.headers;
  3. if(headers['Authorization']==''||headers['Authorization']==null){
  4. const expireTime = localStorage.getItem("expireTime")
  5. if (expireTime) {
  6. const left = Number(expireTime) - new Date().getTime()
  7. const refreshToken = localStorage.getItem("refresh_token")
  8. if (left < checkRegion && refreshToken) {
  9. if (left < 0) {
  10. localStorage.removeItem("expireTime");
  11. localStorage.removeItem("refresh_token");
  12. localStorage.removeItem("access_token");
  13. }
  14. let accessToken = queryRefreshToken(refreshToken);
  15. headers['Authorization'] = 'bezarer ' + accessToken;
  16. } else {
  17. const accessToken = localStorage.getItem("access_token");
  18. if (accessToken) {
  19. headers['Authorization'] = 'bearer ' + accessToken;
  20. }
  21. }
  22. }
  23. }
  24. return (
  25. {
  26. url: url,
  27. options: { ...options, headers: headers },
  28. }
  29. );
  30. })

响应拦截器

  1. request.interceptors.response.use((response, options) => {
  2. //拦截返回后的特殊处理
  3. // if(response.data.code == 1000001){
  4. // console.log(response.data.msg)
  5. // //通过返回的code 提示 token 过期 、token校验失败,做相应跳转
  6. // }
  7. console.log(response)
  8. return response;
  9. });

请求使用案例

新建功能模块后,在模块目录下新建service.ts 用于封装请求信息。
我们以角色信息模块为案例,介绍对应的使用,角色service.ts所在目录:/src/pages/system/role/service.ts

  1. import request from '@/utils/request';
  2. import querystring from 'querystring'
  3. import type { TableListParams, TableListItem } from './data.d';
  4. export async function queryData(params?: TableListParams) {
  5. let queryString = querystring.stringify(params);
  6. return request('/system/role/findListPage?'+queryString, {
  7. data: params,
  8. method: 'get',
  9. headers: {
  10. 'Content-Type': 'application/json;charset=UTF-8',
  11. }
  12. });
  13. }
  14. export async function removeData(params: { ids: string[] }) {
  15. return request('/system/role/'+params.ids, {
  16. method: 'delete',
  17. headers: {
  18. 'Content-Type': 'application/json;charset=UTF-8',
  19. }
  20. });
  21. }
  22. export async function addData(params: TableListItem) {
  23. return request('/system/role', {
  24. method: 'POST',
  25. data: {
  26. ...params,
  27. method: 'post',
  28. },
  29. });
  30. }
  31. export async function updateData(params: TableListParams) {
  32. return request('/system/role', {
  33. method: 'PUT',
  34. data: {
  35. ...params,
  36. method: 'update',
  37. },
  38. });
  39. }
  40. //更新状态
  41. export async function updateStatus(id:string,status:string) {
  42. return request('/system/role/updateStatus', {
  43. method: 'post',
  44. data: {
  45. id,
  46. status
  47. }
  48. });
  49. }
  50. //更新权限
  51. export function updateAuth (params:any) {
  52. return request('/system/role/updateAuth', {
  53. method: 'post',
  54. data: {
  55. ...params
  56. }
  57. });
  58. }
  59. //获取角色菜单列表
  60. export function findRoleMenuList (params:any) {
  61. return request('/system/role/findRoleMenuList', {
  62. data: params,
  63. method: 'post'
  64. });
  65. }

在上面的代码中使用了:post请求、get请求、put请求、delete请求。

post请求

post请求一般处理数据的保存操作,比如角色信息的保存提交。

  1. return request('/system/role', {
  2. method: 'POST',
  3. data: {
  4. ...params,
  5. method: 'post',
  6. },
  7. });

get请求

get请求一般处理数据的查询操作,比如查询角色信息的列表信息、详情信息等等。

  1. return request('/system/role', {
  2. method: 'POST',
  3. data: {
  4. ...params,
  5. method: 'post',
  6. },
  7. });

put请求

put请求一般处理数据的更新操作,比如角色信息的更新数据。

  1. return request('/system/role', {
  2. method: 'PUT',
  3. data: {
  4. ...params,
  5. method: 'update',
  6. },
  7. });

delete请求

delete请求一般处理数据的删除操作,比如角色信息的删除。

  1. return request('/system/role/'+params.ids, {
  2. method: 'delete',
  3. headers: {
  4. 'Content-Type': 'application/json;charset=UTF-8',
  5. }
  6. });