http.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import axiosInstance from './axios'
  2. import {
  3. RequestHttpEnum,
  4. ContentTypeEnum,
  5. RequestBodyEnum,
  6. RequestDataTypeEnum,
  7. RequestContentTypeEnum,
  8. RequestParamsObjType
  9. } from '@/enums/httpEnum'
  10. import type { RequestGlobalConfigType, RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
  11. export const get = <T = any>(url: string, params?: object) => {
  12. return axiosInstance<T>({
  13. url: url,
  14. method: RequestHttpEnum.GET,
  15. params: params,
  16. })
  17. }
  18. export const post = <T = any>(url: string, data?: object, headersType?: string) => {
  19. return axiosInstance<T>({
  20. url: url,
  21. method: RequestHttpEnum.POST,
  22. data: data,
  23. headers: {
  24. 'Content-Type': headersType || ContentTypeEnum.JSON
  25. }
  26. })
  27. }
  28. export const patch = <T = any>(url: string, data?: object, headersType?: string) => {
  29. return axiosInstance<T>({
  30. url: url,
  31. method: RequestHttpEnum.PATCH,
  32. data: data,
  33. headers: {
  34. 'Content-Type': headersType || ContentTypeEnum.JSON
  35. }
  36. })
  37. }
  38. export const put = <T = any>(url: string, data?: object, headersType?: ContentTypeEnum) => {
  39. return axiosInstance<T>({
  40. url: url,
  41. method: RequestHttpEnum.PUT,
  42. data: data,
  43. headers: {
  44. 'Content-Type': headersType || ContentTypeEnum.JSON
  45. }
  46. })
  47. }
  48. export const del = <T = any>(url: string, params?: object) => {
  49. return axiosInstance<T>({
  50. url: url,
  51. method: RequestHttpEnum.DELETE,
  52. params
  53. })
  54. }
  55. // 获取请求函数,默认get
  56. export const http = (type?: RequestHttpEnum) => {
  57. switch (type) {
  58. case RequestHttpEnum.GET:
  59. return get
  60. case RequestHttpEnum.POST:
  61. return post
  62. case RequestHttpEnum.PATCH:
  63. return patch
  64. case RequestHttpEnum.PUT:
  65. return put
  66. case RequestHttpEnum.DELETE:
  67. return del
  68. default:
  69. return get
  70. }
  71. }
  72. const prefix = 'javascript:'
  73. // 对输入字符进行转义处理
  74. export const translateStr = (target: string | Record<any, any>) => {
  75. if (typeof target === 'string') {
  76. if (target.startsWith(prefix)) {
  77. const funcStr = target.split(prefix)[1]
  78. let result
  79. try {
  80. result = new Function(`${funcStr}`)()
  81. } catch (error) {
  82. console.log(error)
  83. window['$message'].error('js内容解析有误!')
  84. }
  85. return result
  86. } else {
  87. return target
  88. }
  89. }
  90. for (const key in target) {
  91. if (Object.prototype.hasOwnProperty.call(target, key)) {
  92. const subTarget = target[key]
  93. target[key] = translateStr(subTarget)
  94. }
  95. }
  96. return target
  97. }
  98. /**
  99. * * 自定义请求
  100. * @param targetParams 当前组件参数
  101. * @param globalParams 全局参数
  102. */
  103. export const customizeHttp = (targetParams: RequestConfigType, globalParams: RequestGlobalConfigType) => {
  104. if (!targetParams || !globalParams) {
  105. return
  106. }
  107. // 全局
  108. const {
  109. // 全局请求源地址
  110. requestOriginUrl,
  111. // 全局请求内容
  112. requestParams: globalRequestParams
  113. } = globalParams
  114. // 目标组件(优先级 > 全局组件)
  115. const {
  116. // 请求地址
  117. requestUrl,
  118. // 普通 / sql
  119. requestContentType,
  120. // 获取数据的方式
  121. requestDataType,
  122. // 请求方式 get/post/del/put/patch
  123. requestHttpType,
  124. // 请求体类型 none / form-data / x-www-form-urlencoded / json /xml
  125. requestParamsBodyType,
  126. // SQL 请求对象
  127. requestSQLContent,
  128. // 请求内容 params / cookie / header / body: 同 requestParamsBodyType
  129. requestParams: targetRequestParams
  130. } = targetParams
  131. // 静态排除
  132. if (requestDataType === RequestDataTypeEnum.STATIC) return
  133. if (!requestUrl) {
  134. return
  135. }
  136. // 处理头部
  137. let headers: RequestParamsObjType = {
  138. ...globalRequestParams.Header,
  139. ...targetRequestParams.Header
  140. }
  141. headers = translateStr(headers)
  142. // data 参数
  143. let data: RequestParamsObjType | FormData | string = {}
  144. // params 参数
  145. let params: RequestParamsObjType = { ...targetRequestParams.Params }
  146. params = translateStr(params)
  147. // form 类型处理
  148. let formData: FormData = new FormData()
  149. formData.set('default', 'defaultData')
  150. // 类型处理
  151. switch (requestParamsBodyType) {
  152. case RequestBodyEnum.NONE:
  153. break
  154. case RequestBodyEnum.JSON:
  155. headers['Content-Type'] = ContentTypeEnum.JSON
  156. data = translateStr(JSON.parse(targetRequestParams.Body['json']))
  157. // json 赋值给 data
  158. break
  159. case RequestBodyEnum.XML:
  160. headers['Content-Type'] = ContentTypeEnum.XML
  161. // xml 字符串赋值给 data
  162. data = translateStr(targetRequestParams.Body['xml'])
  163. break
  164. case RequestBodyEnum.X_WWW_FORM_URLENCODED: {
  165. headers['Content-Type'] = ContentTypeEnum.FORM_URLENCODED
  166. const bodyFormData = targetRequestParams.Body['x-www-form-urlencoded']
  167. for (const i in bodyFormData) formData.set(i, translateStr(bodyFormData[i]))
  168. // FormData 赋值给 data
  169. data = formData
  170. break
  171. }
  172. case RequestBodyEnum.FORM_DATA: {
  173. headers['Content-Type'] = ContentTypeEnum.FORM_DATA
  174. const bodyFormUrlencoded = targetRequestParams.Body['form-data']
  175. for (const i in bodyFormUrlencoded) {
  176. formData.set(i, translateStr(bodyFormUrlencoded[i]))
  177. }
  178. // FormData 赋值给 data
  179. data = formData
  180. break
  181. }
  182. }
  183. // sql 处理
  184. if (requestContentType === RequestContentTypeEnum.SQL) {
  185. headers['Content-Type'] = ContentTypeEnum.JSON
  186. data = requestSQLContent
  187. }
  188. try {
  189. const url = (new Function("return `" + `${requestOriginUrl}${requestUrl}`.trim() + "`"))();
  190. return axiosInstance({
  191. url,
  192. method: requestHttpType,
  193. data,
  194. params,
  195. headers
  196. })
  197. } catch (error) {
  198. console.log(error)
  199. window['$message'].error('URL地址格式有误!')
  200. }
  201. }