safety-eval-service-frontend/.cursor/skills/specs/02-应用配置与开发环境/10-HTTP拦截器配置/SKILL.md

175 lines
6.0 KiB
Markdown
Raw Normal View History

2026-08-14 16:54:03 +08:00
---
name: jjb-http-interceptor-config
description: 定义 JJB 项目 HTTP 拦截器配置规范。在配置 window.jjbCommonGlobalConfig.httpInterceptor、请求/响应拦截或添加 Token/租户ID 时使用。
---
# 应用配置与开发环境
## HTTP 拦截器配置
- **配置位置**:在 `public/index.html` 文件中配置 `window.jjbCommonGlobalConfig.httpInterceptor`
- **配置结构**
```html
<script>
window.jjbCommonGlobalConfig = {
// http拦截器
httpInterceptor: {
// 请求拦截
request: (url, method, data, headers) => {
// 处理你的请求拦截逻辑
// 示例给请求头添加一个租户ID
if (!headers) {
headers = {};
}
headers.tenantId = sessionStorage.getItem('tenantId');
// 示例修改请求URL
// url = url.replace('/old-path', '/new-path');
// 示例:修改请求数据
// data = { ...data, timestamp: Date.now() };
// 必须返回 Promiseresolve 值为数组 [url, method, data, headers]
return Promise.resolve([
url,
method,
data,
headers
]);
},
// 响应拦截
response: res => {
// 处理你的响应拦截逻辑
// 示例:统一处理响应数据
// if (res.data && res.data.code === 200) {
// return Promise.resolve(res.data);
// }
// 示例:错误处理
// if (res.response && res.response.status !== 200) {
// console.error('请求失败:', res.response.status);
// }
// 必须返回 Promiseresolve 值为处理后的响应对象
return Promise.resolve(res);
}
}
}
</script>
```
- **请求拦截器说明**
- **函数签名**`request(url: string, method: string, data?: object, headers?: object | false): Promise<[string, string, object, object | false]>`
- **参数说明**
| 参数 | 类型 | 说明 |
| :--- | :--- | :--- |
| url | string | 请求URL地址 |
| method | string | 请求方法(如 'get'、'post'、'put'、'delete'、'patch' |
| data | object | 请求数据(可选,默认为 `{}` |
| headers | object \| false | 请求头对象(可选,默认为 `false`,如果为 `false` 则使用默认请求头) |
- **返回值****必须返回 Promise**Promise resolve 的值必须为包含四个元素的数组:`[url, method, data, headers]`
- 数组元素顺序固定:`[URL地址, 请求方法, 请求数据, 请求头]`
- 返回的数组会作为参数传递给实际的请求函数执行
- **执行时机**:在请求发送前执行,可以修改请求的 URL、方法、数据和请求头
- **使用示例**
```javascript
request: (url, method, data, headers) => {
// 确保 headers 是对象
const reqHeaders = headers || {};
// 添加 Token
if (!reqHeaders.token && sessionStorage.getItem('token')) {
reqHeaders.token = sessionStorage.getItem('token');
}
// 添加租户ID
reqHeaders.tenantId = sessionStorage.getItem('tenantId');
// 修改请求数据
const reqData = {
...data,
timestamp: Date.now()
};
return Promise.resolve([url, method, reqData, reqHeaders]);
}
```
- **使用场景**适用于需要在请求发送前统一处理请求参数、添加请求头如租户ID、Token等、修改请求URL、添加时间戳等场景
- **响应拦截器说明**
- **函数签名**`response(res: object): Promise<object>`
- **参数说明**
| 参数 | 类型 | 说明 |
| :--- | :--- | :--- |
| res | object | 响应对象,包含完整的响应信息(成功时包含 `data`、`status` 等,失败时包含 `response`、`message` 等) |
- **返回值****必须返回 Promise**Promise resolve 的值为处理后的响应对象
- **执行时机**:在响应返回后执行,**无论请求成功还是失败都会执行**
- 成功时:响应对象包含 `data`、`status`、`headers` 等属性
- 失败时:响应对象包含 `response`、`message`、`code` 等错误信息
- **使用示例**
```javascript
response: res => {
// 成功响应处理
if (res.data && res.status === 200) {
// 统一处理响应数据格式
return Promise.resolve({
...res.data,
success: res.data.success !== false
});
}
// 错误响应处理
if (res.response) {
console.error('请求失败:', res.response.status, res.response.data);
}
return Promise.resolve(res);
}
```
- **使用场景**:适用于需要在响应返回后统一处理响应数据、错误处理、数据格式转换、统一错误提示等场景
- **注意事项**
- **配置时机**HTTP 拦截器配置必须在应用启动前完成,建议放在 `public/index.html``<head>``<body>` 开始位置
- **请求拦截器要求**
- 必须返回 Promise 对象
- Promise resolve 的值必须为包含四个元素的数组:`[url, method, data, headers]`
- 数组元素顺序固定,不能改变
- 如果不需要修改某个参数,也需要原样返回
- **响应拦截器要求**
- 必须返回 Promise 对象
- Promise resolve 的值为处理后的响应对象
- 响应拦截器会在请求成功和失败时都被调用,需要根据实际情况处理
- **参数处理**
- 请求拦截器的 `headers` 参数可能为 `false`,使用时需要先判断或转换为对象
- 请求拦截器的 `data` 参数默认为 `{}`,但可能为任意对象结构
- **错误处理**
- 拦截器中的异步操作应使用 Promise 处理,确保拦截器链的正常执行
- 如果拦截器抛出错误或返回的 Promise reject可能导致请求失败