如果还没看本专栏的上一篇文章,请移步。
本文章旨在提供分层封装axios后的实际使用api的方法。
import { http } from '@/utils/request'
// 基本 GET 请求
const getData = async () => {
try {
const data = await http.get('/api/endpoint')
console.log('获取数据成功:', data)
} catch (error) {
console.error('获取数据失败:', error)
}
}
// 带参数的 GET 请求
const getWithParams = async (id: string) => {
try {
const data = await http.get('/api/items', { id, page: 1, size: 10 })
console.log('获取列表数据:', data)
} catch (error) {
console.error('获取列表失败:', error)
}
}
// 基本 POST 请求
const createItem = async (itemData: any) => {
try {
const result = await http.post('/api/items', itemData)
console.log('创建成功:', result)
return result
} catch (error) {
console.error('创建失败:', error)
throw error
}
}
// types/user.ts
export interface User {
id: number
username: string
email: string
avatarUrl?: string
// 其他用户字段...
}
// 定义 API 响应类型
export interface ApiResponse<T> {
code: number
data: T
message: string
}
import { http } from '@/utils/request'
import type { User, ApiResponse } from '@/types/user'
// 获取用户信息
const fetchUser = async (userId: number): Promise<User> => {
try {
const user = await http.get<User>(`/users/${userId}`)
return user
} catch (error) {
console.error('获取用户信息失败:', error)
throw error
}
}
// 创建用户
const createUser = async (userData: Omit<User, 'id'>): Promise<User> => {
try {
const newUser = await http.post<User>('/users', userData)
return newUser
} catch (error) {
console.error('创建用户失败:', error)
throw error
}
}
const uploadFile = async (file: File) => {
try {
const formData = new FormData()
formData.append('file', file)
const result = await http.upload('/upload', file)
console.log('上传成功:', result)
return result
} catch (error) {
console.error('上传失败:', error)
throw error
}
}
// 在组件中使用
const handleFileChange = (event: Event) => {
const input = event.target as HTMLInputElement
if (input.files && input.files[0]) {
uploadFile(input.files[0])
}
}
const fetchData = async () => {
try {
const data = await http.get('/api/data')
return data
} catch (error) {
// 错误已经在 request.ts 中统一处理
// 这里可以添加额外的错误处理逻辑
console.error('自定义错误处理:', error)
throw error // 重新抛出错误,让调用方也能处理
}
}
import { handleApiError } from '@/api/apiError'
const fetchWithCustomErrorHandling = async () => {
try {
const data = await http.get('/api/data')
return data
} catch (error) {
// 自定义错误处理
if (error.response?.status === 404) {
console.error('资源未找到')
} else if (error.response?.status === 401) {
// 未授权,跳转到登录页
router.push('/login')
} else {
// 使用统一的错误处理
handleApiError(error)
}
throw error
}
}
const fetchWithCustomHeaders = async () => {
try {
const data = await http.get('/api/data', {
headers: {
'X-Custom-Header': 'value',
'Authorization': 'Bearer custom-token'
}
})
return data
} catch (error) {
console.error('请求失败:', error)
throw error
}
}
import axios from 'axios'
// 创建取消令牌
const CancelToken = axios.CancelToken
const source = CancelToken.source()
// 发送请求
const fetchData = async () => {
try {
const data = await http.get('/api/data', {
cancelToken: source.token
})
return data
} catch (error) {
if (axios.isCancel(error)) {
console.log('请求已被取消:', error.message)
} else {
console.error('请求失败:', error)
}
throw error
}
}
// 取消请求
const cancelRequest = () => {
source.cancel('用户取消了请求')
}
响应拦截器已经内置在 request.ts
中,会自动处理以下内容:
// src/api/user.ts
import { http } from '@/utils/request'
import type { User } from '@/types/user'
export const userApi = {
// 获取用户信息
getProfile: async (): Promise<User> => {
return http.get('/user/profile')
},
// 更新用户信息
updateProfile: async (userData: Partial<User>): Promise<User> => {
return http.put('/user/profile', userData)
},
// 上传头像
uploadAvatar: async (file: File): Promise<{ avatarUrl: string }> => {
return http.upload('/user/avatar', file)
}
}
加载中...
{{ error }}
{{ user.username }}
{{ user.email }}
如果遇到跨域问题,请确保:
默认请求超时时间为 10 秒,可以在 request.ts
中修改:
const request = axios.create({
// ...
timeout: 15000, // 修改为 15 秒
// ...
})
可以在浏览器的开发者工具的 Network 标签页中查看所有请求和响应。
http.get
, http.post
等方法发送请求http.upload
方法通过本指南,您应该能够轻松地在前端应用中使用封装好的 HTTP 客户端进行数据交互。