import axios from 'axios' import type { CancelTokenStatic, AxiosRequestConfig, AxiosInstance, AxiosError, InternalAxiosRequestConfig, AxiosResponse, CancelTokenSource } from 'axios' import { useGlobalStore } from '@/stores' import { hasOwn, hasOwnDefault } from '@/utils' import { ElMessage } from 'element-plus' /** * @description: 请求配置 * @param {extendHeaders} {[key: string]: string} 扩展请求头用于不满足默认的 Content-Type、token 请求头的情况 * @param {ignoreLoading} boolean 是否忽略 loading 默认 false * @param {token} boolean 是否携带 token 默认 true * @param {ignoreCR} boolean 是否取消请求 默认 false * @param {ignoreCRMsg} string 取消请求的提示信息 默认 Request canceled * @param {contentType} $ContentType 重新定义 Content-Type 默认 json * @param {baseURL} $baseURL baseURL 默认 horizon * @param {timeout} number 超时时间 默认 10000 * @return {_AxiosRequestConfig} **/ interface _AxiosRequestConfig extends AxiosRequestConfig { extendHeaders?: { [key: string]: string } ignoreLoading?: boolean token?: boolean ignoreCR?: boolean ignoreCRMsg?: string } enum ContentType { html = 'text/html', text = 'text/plain', file = 'multipart/form-data', json = 'application/json', form = 'application/x-www-form-urlencoded', stream = 'application/octet-stream', } interface PendingRequest { url?: string cancel: () => void } const Request: AxiosInstance = axios.create() const CancelToken: CancelTokenStatic = axios.CancelToken const source: CancelTokenSource = CancelToken.source() const pendingRequests: Map<string, PendingRequest> = new Map() const globalStore = useGlobalStore() Request.interceptors.request.use( (config: InternalAxiosRequestConfig) => { globalStore.setGlobalState('loading', !hasOwnDefault(config, 'ignoreLoading', true)) config.baseURL = hasOwnDefault(config, 'baseURL', '/api') config.headers = { ...config.headers, ...{ 'Content-Type': ContentType[hasOwnDefault(config, 'Content-Type', 'json')], }, ...hasOwnDefault(config, 'extendHeaders', {}), } hasOwnDefault(config, 'token', true) && (config.headers.token = globalStore.token) config.data = config.data || {} config.params = config.params || {} config.timeout = hasOwnDefault(config, 'timeout', 10000) config.cancelToken = config.cancelToken || new CancelToken(cancel => { const url = config.url || '' if (!pendingRequests.has(url)) { pendingRequests.set(url, { cancel }) } }) hasOwnDefault(config, 'ignoreCR', false) && config.cancelToken!.promise.catch(reason => { ElMessage.warning(hasOwnDefault(config, 'ignoreCRMsg', 'Request canceled')) throw reason }) console.log(pendingRequests) return config }, (error: AxiosError) => { return Promise.reject(error) } ) Request.interceptors.response.use( (response: AxiosResponse) => { globalStore.setGlobalState('loading', false) return response.data }, (error: AxiosError) => { globalStore.setGlobalState('loading', false) const url = error.config.url || '' const pendingRequest = pendingRequests.get(url) if (pendingRequest) { pendingRequest.cancel() pendingRequests.delete(url) } ElMessage.error(error.message) return Promise.reject(error) } ) export default (config?: _AxiosRequestConfig) => Request(config) 根据这段代码给出例子
时间: 2024-01-08 16:03:03 浏览: 24
假设你要发送一个 GET 请求,请求的 URL 是 `https://example.com/api/data`,并且带上一个参数 `id`,值为 123。你可以这样调用:
```js
import Request, { ContentType } from '@/utils/request'
const data = {
id: 123
}
Request({
url: '/data',
method: 'get',
params: data,
headers: {
'Content-Type': ContentType.json
}
}).then(response => {
console.log(response)
}).catch(error => {
console.error(error)
})
```
这个例子中,我们使用了自定义的 `ContentType` 枚举来指定请求头的 Content-Type。同时,我们在请求中带上了一个参数 `id`,值为 123。最终请求的 URL 为 `/data?id=123`。请求成功时,我们会在控制台输出返回的数据;请求失败时,我们会在控制台输出错误信息。
相关问题
import * as axios from 'axios'和import axios from 'axios'的区别
import * as axios from 'axios' 和 import axios from 'axios' 的区别在于导入的方式和使用的方式不同。
1. import * as axios from 'axios' 是将整个 axios 模块作为一个对象导入,可以通过 axios.xxx 的方式来使用 axios 提供的各种功能。这种方式会将 axios 模块中的所有方法和属性都导入到一个对象中,需要通过对象名来访问具体的方法或属性。
2. import axios from 'axios' 是将 axios 模块默认导出的内容直接导入,可以直接使用 axios 来调用其中的方法。这种方式只会导入 axios 模块默认导出的内容,不需要通过对象名来访问。
总结一下:
- import * as axios from 'axios' 导入整个 axios 模块作为一个对象,需要通过对象名来访问具体的方法或属性。
- import axios from 'axios' 直接导入 axios 模块默认导出的内容,可以直接使用 axios 来调用其中的方法。
使用import axios from "axios"
使用import语句可以将axios库引入到你的项目中。这样你就可以使用axios来发送HTTP请求了。下面是一个简单的示例:
```javascript
import axios from "axios";
axios.get("https://api.example.com/data")
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
```
在这个示例中,我们使用axios发送了一个GET请求到"https://api.example.com/data"。当请求成功时,我们打印出返回的数据;当请求失败时,我们打印出错误信息。
需要注意的是,你需要在项目中安装axios库。你可以使用npm或者yarn来安装axios例如:
```shell
npm install axios
```
或者
```shell
yarn add axios
```