Bläddra i källkod

perf: request请求根据ContentType自动转换数据

kailong321200875 1 år sedan
förälder
incheckning
ef9aa62572
3 ändrade filer med 29 tillägg och 3 borttagningar
  1. 8 2
      src/axios/index.ts
  2. 10 1
      src/constants/index.ts
  3. 11 0
      src/utils/index.ts

+ 8 - 2
src/axios/index.ts

@@ -1,15 +1,21 @@
 import service from './service'
-import { CONTENT_TYPE } from '@/constants'
+import { CONTENT_TYPE, TRANSFORM_REQUEST_DATA } from '@/constants'
 import { useUserStoreWithOut } from '@/store/modules/user'
+import { objToFormData } from '@/utils'
 
 const request = (option: AxiosConfig) => {
   const { url, method, params, data, headers, responseType } = option
+  // 是否需要转换数据格式
+  const transformData =
+    TRANSFORM_REQUEST_DATA &&
+    (headers?.['Content-Type'] || CONTENT_TYPE) === 'multipart/form-data' &&
+    data
   const userStore = useUserStoreWithOut()
   return service.request({
     url: url,
     method,
     params,
-    data,
+    data: transformData ? objToFormData(data) : data,
     responseType: responseType,
     headers: {
       'Content-Type': CONTENT_TYPE,

+ 10 - 1
src/constants/index.ts

@@ -6,7 +6,11 @@ export const SUCCESS_CODE = 0
 /**
  * 请求contentType
  */
-export const CONTENT_TYPE = 'application/json'
+export const CONTENT_TYPE:
+  | 'application/json'
+  | 'multipart/form-data'
+  | 'application/x-www-form-urlencoded'
+  | 'text/plain' = 'multipart/form-data'
 
 /**
  * 请求超时时间
@@ -27,3 +31,8 @@ export const NO_RESET_WHITE_LIST = ['Redirect', 'Login', 'NoFind', 'Root']
  * 表格默认过滤列设置字段
  */
 export const DEFAULT_FILTER_COLUMN = ['expand', 'selection']
+
+/**
+ * 是否根据headers->content-type自动转换数据格式
+ */
+export const TRANSFORM_REQUEST_DATA = true

+ 11 - 0
src/utils/index.ts

@@ -124,3 +124,14 @@ export function toAnyString() {
 export function firstUpperCase(str: string) {
   return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase())
 }
+
+/**
+ * 把对象转为formData
+ */
+export function objToFormData(obj: Recordable) {
+  const formData = new FormData()
+  Object.keys(obj).forEach((key) => {
+    formData.append(key, obj[key])
+  })
+  return formData
+}