偶然候在二次封装axios时常常会遇到使用哀求参数的问题,下面就是我很好的区分这些参数的各自作用和使用场景,欢迎点赞评论哦~
首先明确axios 的一些基本配置选项
axios 提供了一个非常灵活的配置选项,答应你自定义哀求的各种属性。当你使用 axios 或者一个自定义的 axios 实例(如 axiosInstance)时,你可以通过 requestOptions 对象传递这些配置。以下是一些常见的 requestOptions 属性及其用途:
基本哀求配置
- url (string): 哀求的 URL。
- method (string): 哀求方法(比方 get, post, put, delete 等)。默认为 get。
- baseURL (string): 用于设置哀求的基本 URL。
- headers (object): 设置哀求头。
- params (object): 设置 URL 查询参数。
- data (any): 发送到服务器的数据。对于 POST、PUT 和 PATCH 哀求,这通常是哀求体。
- timeout (number): 设置哀求超时时间(以毫秒为单位)。
- responseType (string): 指定响应类型(比方 arraybuffer, blob, document, json, text, stream)。
- responseEncoding (string): 指定响应编码(比方 utf8)。
- xsrfCookieName (string): 用于 CSRF 掩护的 cookie 名称。
- xsrfHeaderName (string): 用于 CSRF 掩护的 HTTP 头名称。
- maxContentLength (number): 定义内容的最大长度(以字节为单位)。
- maxBodyLength (number): 定义哀求体的最大长度(以字节为单位)。
- validateStatus (function): 自定义状态码验证函数。
- cancelToken (CancelToken): 用于取消哀求的令牌。
- onUploadProgress (function): 上传进度变乱处置惩罚程序。
- onDownloadProgress (function): 下载进度变乱处置惩罚程序。
- auth (object): 包含 username 和 password 的对象,用于基本认证。
- withCredentials (boolean): 是否发送 cookies。
- transformRequest (array | function): 在哀求发送前对数据进行转换。
- transformResponse (array | function): 在响应数据返回后对数据进行转换。
下面是封装的axios(可以鉴戒):
- import router from '@/router'
- import { useTagsViewStore } from '@/store/modules/tagsView'
- import { useUserStore } from '@/store/modules/user'
- import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'
- import { ElLoading, ElMessageBox } from 'element-plus'
- import { Loading } from 'element-plus/es/components/loading/src/service'
- let loading = null
- class HttpRequest {
- private readonly baseUrl: string = import.meta.env.VITE_BASE_REQUEST_URL
- private defaultConfig() {
- return {
- baseURL: this.baseUrl,
- timeout: 10000,
- withCredentials: true,
- headers: {
- 'Content-Type': 'application/json;charset=utf-8',
- },
- }
- }
- private interceptors(instance: AxiosInstance) {
- // 请求拦截
- instance.interceptors.request.use(
- (config) => {
- // 添加全局的loading..
- loading = ElLoading.service({
- fullscreen: true,
- lock: true,
- text: '正在加载...',
- background: 'rgba(0, 0, 0, 0.7)',
- })
- // 请求头携带token
- const UserStore = useUserStore()
- const token = UserStore.token
- if (token) {
- config.headers.Authorization = 'Bearer ' + token
- }
- // console.log('请求拦截config', config)
- return config
- },
- (error: any) => {
- return Promise.reject(error)
- },
- )
- //响应拦截
- instance.interceptors.response.use(
- (res) => {
- // console.log('响应拦截res', res)
- const UserStore = useUserStore()
- const TagsViewStore = useTagsViewStore()
- if (res.data.code != 200 && res.data.code != 401) {
- loading.close()
- ElMessage.error(res.data.msg)
- return Promise.reject(res.data)
- } else if (res.data.code === 401) {
- loading.close()
- ElMessageBox.alert('登录的信息已过期,请重新登录', '提示', {
- confirmButtonText: '确定',
- callback: async () => {
- await router.go(0)
- await UserStore.logout()
- TagsViewStore.clearVisitedView()
- ElMessage({
- type: 'success',
- message: '退出登录成功!需重新登录。',
- })
- },
- })
- // return Promise.reject(res.data)
- }
- loading.close()
- return res
- },
- (error: any) => {
- loading.close()
- return Promise.reject(error)
- },
- )
- }
- public request(options: AxiosRequestConfig) {
- const axiosInstance = axios.create()
- let requestOptions: any = {}
- if (options['method'].toLowerCase() == 'get') {
- requestOptions = this.defaultConfig()
- requestOptions.headers = {}
- requestOptions = Object.assign(requestOptions, options)
- } else {
- requestOptions = this.defaultConfig()
- for (let conf in options) {
- if (conf == 'params') requestOptions['data'] = options[conf]
- else requestOptions[conf] = options[conf]
- }
- }
- this.interceptors(axiosInstance)
- return axiosInstance(requestOptions)
- }
- }
- const http = new HttpRequest()
- export default http
复制代码 详细代码剖析如下:
params(实用axios的get哀求):
在使用 axios 发送 GET 哀求时,你可以通过 params 参数来传递查询参数。params 是一个对象,此中的键值对会被转换为 URL 查询字符串。
哀求接口:http.request({ url: 'api/merAcct/list', method: 'get', params: {pageIndex: 1,pageSize:2}})
对应上面封装axios的逻辑片断
public request(options: AxiosRequestConfig) {
const axiosInstance = axios.create()
let requestOptions: any = {}
if (options['method'].toLowerCase() == 'get') {
requestOptions = this.defaultConfig()
requestOptions.headers = {}
requestOptions = Object.assign(requestOptions, options)
} else {
requestOptions = this.defaultConfig()
for (let conf in options) {
if (conf == 'params') requestOptions['data'] = options[conf]
else requestOptions[conf] = options[conf]
}
}
this.interceptors(axiosInstance)
return axiosInstance(requestOptions)
}
那么在axiosInstance(requestOptions)的requestOptions选项配置里面实际是下面这样的
因为 哀求头requestOptions.headers = {}
{
baseURL: https://localhost:8080/
url: 'api/merAcct/list',
params: {pageIndex: 1,pageSize:2}
timeout: 10000,
withCredentials: true,
headers: {},
实际上url会变成
- https://localhost:8080/api/merAcct/list?pageIndex=1&pageSize=20
复制代码 这就是你的实际哀求接口链接
data(实用axios的post哀求):
哀求接口:http.request({ url: 'api/merAcct/list', method: 'post', params: {pageIndex: 1,pageSize:2}})
对应上面封装axios的逻辑片断
public request(options: AxiosRequestConfig) {
const axiosInstance = axios.create()
let requestOptions: any = {}
if (options['method'].toLowerCase() == 'get') {
requestOptions = this.defaultConfig()
requestOptions.headers = {}
requestOptions = Object.assign(requestOptions, options)
} else {
requestOptions = this.defaultConfig()
for (let conf in options) {
if (conf == 'params') requestOptions['data'] = options[conf]
else requestOptions[conf] = options[conf]
}
}
this.interceptors(axiosInstance)
return axiosInstance(requestOptions)
}
那么在axiosInstance(requestOptions)的requestOptions选项配置里面实际是下面这样的
因为if (conf == 'params') requestOptions['data'] = options[conf]所以把params的数据给到data参数,是JSON数据格式
{
baseURL: https://localhost:8080/
url: 'api/merAcct/list',
data: {pageIndex: 1,pageSize:2}
timeout: 10000,
withCredentials: true,
headers: {
'Content-Type': 'application/json;charset=utf-8',
},
实际上url会变成
https://localhost:8080/api/merAcct/list
formData(实用axios的post哀求):
在 axios 中,requestOptions 对象本身并没有一个名为 formData 的属性。formData 通常是指你使用 FormData 对象来构建哀求体数据,并将其作为 data 属性传递给 axios 哀求。
http.request({ url: 'api/merAcct/list', method: 'post', params:formData})
通过if (conf == 'params') requestOptions['data'] = options[conf]转化成
- {
- baseURL: https://localhost:8080/
- url: 'api/merAcct/list',
- data: {pageIndex: 1,pageSize:2}
- timeout: 10000,
- withCredentials: true,
- headers: {
- 'Content-Type': 'multipart/form-data' // 设置适当的 Content-Type
- },
复制代码 解说就到这了哦,不懂请留言或者私信我~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |