const http = axios.create({ timeout: 1000 * 30, withCredentials: true, headers: { 'Content-Type': 'application/json; charset=utf-8' } }) //请求拦截器 http.interceptors.request.use( config => { var Authorization = localStorage.getItem("Authorization") // debugger // console.log("授权码是:" + Authorization) if (Authorization) { //判断token是否存在 config.headers['Authorization'] = Authorization; //将token设置成请求头 } return config; }, err => { return Promise.reject(err); } );
时间: 2024-02-14 17:21:07 浏览: 22
这段代码是使用axios创建了一个名为http的实例,并配置了一些属性,如超时时间(timeout)为30秒,开启跨域凭证(withCredentials),请求头中设置Content-Type为application/json; charset=utf-8。同时,还添加了一个请求拦截器,在发起请求前会检查本地存储中是否存在名为Authorization的授权码,如果存在则将其添加到请求头中的Authorization字段中。最后,使用Promise.reject()方法将错误信息返回。
相关问题
const http = axios.create({ timeout: 1000 * 86400, withCredentials: true, baseURL: '/star', headers: { 'Content-Type': 'application/json; charset=utf-8' } }) // 请求拦截 http.interceptors.request.use(config => { config.headers['Token'] = storage.get('Token') // 请求头带上token return config }, error => { return Promise.reject(error) }) // 响应拦截 http.interceptors.response.use(response => { if (response.data && response.data.code === 401) { // 401, token失效 router.push({ name: 'login' }) } return response }, error => { return Promise.reject(error) }) export default http
这是一个使用 axios 封装的 HTTP 请求实例,包括请求拦截和响应拦截。具体实现如下:
1. 创建一个名为 http 的 axios 实例,设置基础 URL、超时时间、跨域请求时是否需要凭证等参数。
```javascript
const http = axios.create({
timeout: 1000 * 86400, // 请求超时时间
withCredentials: true, // 跨域请求时是否需要使用凭证
baseURL: '/star', // 基础URL
headers: {
'Content-Type': 'application/json; charset=utf-8' // 请求头配置
}
})
```
2. 添加请求拦截器,当发起请求时,在请求头中添加 token,以便后端验证用户身份。
```javascript
http.interceptors.request.use(config => {
config.headers['Token'] = storage.get('Token') // 在请求头中添加 Token
return config
}, error => {
return Promise.reject(error)
})
```
3. 添加响应拦截器,当后端返回 401 状态码时,表示用户身份验证失败,此时跳转到登录页。
```javascript
http.interceptors.response.use(response => {
if (response.data && response.data.code === 401) { // 后端返回 401 状态码
router.push({ name: 'login' }) // 跳转到登录页
}
return response
}, error => {
return Promise.reject(error)
})
```
4. 导出 http 实例,供其他组件调用。
```javascript
export default http
```
这样封装后,我们在项目中可以直接使用 http 实例进行 API 请求,并自动携带 token,同时也可以处理后端返回的 401 状态码。
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', } const Request: AxiosInstance = axios.create() const CancelToken: CancelTokenStatic = axios.CancelToken const source: CancelTokenSource = CancelToken.source() 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 = source.token config.withCredentials = true hasOwnDefault(config, 'ignoreCR', false) && source.cancel(hasOwnDefault(config, 'ignoreCRMsg', 'Request canceled')) return config }, (error: AxiosError) => { return Promise.reject(error) } ) Request.interceptors.response.use( (response: AxiosResponse) => { globalStore.setGlobalState('loading', false) const { data, status } = response let obj = { ...data } if (!hasOwn(data, 'status')) obj.status = status return obj }, (error: AxiosError) => { globalStore.setGlobalState('loading', false) ElMessage.error(error.message) return Promise.reject(error) } ) export default (config?: _AxiosRequestConfig) => Request(config) 修改代码,使其能够批量取消请求
你可以在创建 axios 实例时添加一个 cancelToken 选项,并使用相同的 cancelToken 对象来取消多个请求。具体步骤如下:
1. 定义一个 cancelToken 对象
```typescript
const CancelToken: CancelTokenStatic = axios.CancelToken
const source: CancelTokenSource = CancelToken.source()
```
2. 将 cancelToken 对象传递给所有请求的 config 中
```typescript
config.cancelToken = source.token
```
3. 当需要取消请求时,调用 source.cancel()
```typescript
source.cancel('取消请求')
```
完整代码如下:
```typescript
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',
}
const Request: AxiosInstance = axios.create()
const CancelToken: CancelTokenStatic = axios.CancelToken
const source: CancelTokenSource = CancelToken.source()
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 = source.token // 将 cancelToken 对象传递给请求的 config
config.withCredentials = true
hasOwnDefault(config, 'ignoreCR', false) && source.cancel(hasOwnDefault(config, 'ignoreCRMsg', 'Request canceled')) // 当需要取消请求时,调用 source.cancel()
return config
},
(error: AxiosError) => {
return Promise.reject(error)
}
)
Request.interceptors.response.use(
(response: AxiosResponse) => {
globalStore.setGlobalState('loading', false)
const { data, status } = response
let obj = { ...data }
if (!hasOwn(data, 'status')) obj.status = status
return obj
},
(error: AxiosError) => {
globalStore.setGlobalState('loading', false)
ElMessage.error(error.message)
return Promise.reject(error)
}
)
export default (config?: _AxiosRequestConfig) => Request(config)
```