跳到主要内容

后端请求

ChikoAdmin 基于 @chiko-admin/axios 封装了完整的 HTTP 请求系统,支持统一的错误处理、认证管理和响应转换。

请求实例

主服务请求

项目使用 createFlatRequest 创建主请求实例:

// src/services/request/index.ts
export const request = createFlatRequest<App.Service.Response, RequestInstanceState>(
{
baseURL: globalConfig.serviceBaseURL,
headers: {}
},
{
isBackendSuccess(response) {
return String(response.data.code) === import.meta.env.VITE_SERVICE_SUCCESS_CODE;
},
async onBackendFail(response, instance) {
await backEndFail(response, instance, request);
},
onError(error) {
handleError(error, request);
},
async onRequest(config) {
const Authorization = getAuthorization();
Object.assign(config.headers, { Authorization });
return config;
},
transformBackendResponse(response) {
return response.data.data;
}
}
);

其他服务请求

当需要连接多个后端服务时,可以创建额外的请求实例:

export const demoRequest = createRequest<App.Service.DemoResponse>(
{
baseURL: globalConfig.serviceOtherBaseURL.demo
},
{
isBackendSuccess(response) {
return response.data.status === '200';
},
transformBackendResponse(response) {
return response.data.result;
}
}
);

API 服务

认证相关 API

// src/services/api/auth.ts
import { request } from '../request';

export function fetchLogin(userName: string, password: string) {
return request<Api.Auth.LoginToken>({
data: { password, userName },
method: 'post',
url: '/auth/login'
});
}

export function fetchGetUserInfo() {
return request<Api.Auth.UserInfo>({ url: '/auth/getUserInfo' });
}

export function fetchRefreshToken(refreshToken: string) {
return request<Api.Auth.LoginToken>({
data: { refreshToken },
method: 'post',
url: '/auth/refreshToken'
});
}

系统管理 API

// src/services/api/system.ts
export function fetchGetRoleList(params: Api.SystemManage.RoleSearchParams) {
return request<Api.SystemManage.RoleList>({
params,
url: '/system/role/getRoleList'
});
}

export function fetchGetUserList(params: Api.SystemManage.UserSearchParams) {
return request<Api.SystemManage.UserList>({
params,
url: '/system/user/getUserList'
});
}

请求配置

基础配置

  • baseURL: 从环境变量获取服务地址
  • headers: 自动添加认证头
  • timeout: 请求超时时间

拦截器配置

  • onRequest: 自动添加 Authorization 头
  • onResponse: 统一处理响应数据
  • onError: 统一错误处理
  • onBackendFail: 处理后端业务错误

类型定义

响应类型

// src/types/api.d.ts
declare namespace Api {
namespace Common {
interface PaginatingQueryRecord<T = any> {
current: number;
size: number;
total: number;
records: T[];
}
}

namespace Auth {
interface LoginToken {
refreshToken: string;
token: string;
}

interface UserInfo {
buttons: string[];
roles: string[];
userId: string;
userName: string;
}
}
}

请求状态类型

export interface RequestInstanceState {
errMsgStack: string[];
refreshTokenFn: Promise<boolean> | null;
}

使用方式

发送请求

import { fetchGetUserInfo } from '@/services/api/auth';

function UserProfile() {
const [userInfo, setUserInfo] = useState<Api.Auth.UserInfo | null>(null);

useEffect(() => {
fetchGetUserInfo()
.then(data => setUserInfo(data))
.catch(error => console.error('获取用户信息失败:', error));
}, []);

return (
<div>
{userInfo && <p>欢迎,{userInfo.userName}</p>}
</div>
);
}

分页查询

import { fetchGetUserList } from '@/services/api/system';

function UserList() {
const [users, setUsers] = useState<Api.SystemManage.UserList | null>(null);

const loadUsers = (params: Api.SystemManage.UserSearchParams) => {
fetchGetUserList(params)
.then(data => setUsers(data))
.catch(error => console.error('获取用户列表失败:', error));
};

return (
<div>
<button onClick={() => loadUsers({ current: 1, size: 10 })}>
加载用户列表
</button>
{users && (
<div>
<p>{users.total} 条记录</p>
{users.records.map(user => (
<div key={user.id}>{user.userName}</div>
))}
</div>
)}
</div>
);
}

错误处理

自动错误处理

请求实例会自动处理常见错误:

  • 网络错误
  • 认证失败
  • 后端业务错误
  • 响应格式错误

自定义错误处理

export function fetchCustomBackendError(code: string, msg: string) {
return request({
params: { code, msg },
url: '/auth/error'
});
}

常见问题

Q: 请求失败怎么办?

A: 检查网络连接、认证状态和后端服务是否正常。

Q: 如何处理认证失败?

A: 系统会自动处理 token 过期,尝试刷新 token 或跳转到登录页。

Q: 如何添加新的 API 接口?

A: 在 src/services/api/ 目录下创建新的文件,定义接口函数和类型。