Files
nianxx-h5/docs/request.md
duanshuwen 548df7020c feat: initial project setup with core infrastructure and api clients
- Add environment configs for dev/staging/prod environments
- Implement centralized axios request utility with standardized error handling
- Add shared TypeScript types for API responses and requests
- Create comprehensive API client modules for all core endpoints
- Configure vue router with all application page routes
- Add icon fonts, static assets, and loading animations
- Set up project documentation and collaboration guidelines
- Remove deprecated uni-app bridge component files
2026-05-26 21:42:36 +08:00

2.7 KiB
Raw Permalink Blame History

统一请求库使用说明

统一请求库实现位置:

  • src/utils/request.ts
  • 类型定义:src/shared/request-types.ts

环境变量

必须配置:

  • VITE_API_BASE_URL:接口基础地址(例如 https://api.example.com

可选配置:

  • VITE_API_TIMEOUT_MS:请求超时毫秒数(默认 15000

上下文注入header 来源)

请求库会在请求时自动注入以下 header有值才注入

  • Authorization: Bearer <token>(可通过 skipAuth: true 跳过)
  • clientId
  • X-Latitude
  • X-Longitude
  • language

你需要在业务合适时机写入上下文(内存态):

import {
  setAuthToken,
  setClientId,
  setLocation,
  setLanguage,
} from "@/utils/request";

setClientId("your-client-id");
setAuthToken("token-string");
setLocation(30.12345, 120.12345);
setLanguage("zh-CN");

说明:

  • language 如果未显式设置,会尝试从 i18n 的 getCurrentLocale() 获取

发起请求

request兼容旧代码风格返回 { code, message, data }

import { request } from "@/utils/request";

const res = await request<{ records: unknown[] }>({
  method: "GET",
  url: "/xxx/list",
  params: { pageNum: 1, pageSize: 10 },
});

console.log(res.data.records);

requestData推荐新代码风格只返回 data

import { requestData } from "@/utils/request";

const data = await requestData<{ records: unknown[] }>({
  method: "GET",
  url: "/xxx/list",
  params: { pageNum: 1, pageSize: 10 },
});

console.log(data.records);

跳过 Authorization

import { request } from "@/utils/request";

await request<string>(
  {
    method: "GET",
    url: "/public/ping",
  },
  { skipAuth: true },
);

临时追加 headers

import { request } from "@/utils/request";

await request(
  { method: "POST", url: "/xxx", data: { a: 1 } },
  { headers: { "X-Debug": "1" } },
);

错误处理(只抛错,不做 Toast

请求失败会抛出一个 RequestError(符合 NormalizedError 结构),可根据 kind 分流:

  • business:后端返回 { code, message, data }code !== 0
  • httpHTTP 状态码错误(如 401/403/500
  • network:断网/超时等(无 response
  • unknown:返回结构不符合预期等其它情况

示例:

import type { NormalizedError } from "@/shared/request-types";
import { requestData } from "@/utils/request";

try {
  await requestData({ method: "GET", url: "/xxx" });
} catch (e) {
  const err = e as NormalizedError;
  if (err.kind === "business") {
    // err.message / err.code
  } else if (err.kind === "http") {
    // err.httpStatus
  } else if (err.kind === "network") {
    // err.message
  }
}