axios请求requestBody和formData

前言

在vue的后台管理开发中,应需求,需要对信息做一个校验,需要将参数传递两份过去,一份防止在body中,一份防止在formdata中,axios请求会默认将参数放在formdata中进行发送。
对前端而言其实都一样,无非就是参数的格式问题。
对后端而言
(form data)可以用request.getParameter(接收参数名)
(request payload)用request.getParameter是接收不到值,必须用输入流获取,得到字符串在转json
应需求有的接口是需要放在body中有的要放在formdata中,所以前端需要做一个灵活的处理,因为就算只是更改headers中的字段也会让人时时刻刻记得。所以最终我将请求文件封装如下:
  1. /**
  2. * @description 配置网络请求
  3. * @author luokaibin chaizhiyang
  4. */
  5. import axios from 'axios'
  6. import { Message} from 'element-ui'
  7. import router from '../router/permission'
  8. import Vue from 'vue'
  9. import VueCookies from 'vue-cookies'
  10. const moment = require('moment');
  11. const Base64 = require('js-base64').Base64;
  12. // loading框设置局部刷新,且所有请求完成后关闭loading框
  13. var loading;
  14. function startLoading() {
  15. loading = Vue.prototype.$loading({
  16. lock: true,
  17. text: "Loading...",
  18. target: document.querySelector('.loading-area')//设置加载动画区域
  19. });
  20. }
  21. function endLoading() {
  22. loading.close();
  23. }
  24. // 声明一个对象用于存储请求个数
  25. var needLoadingRequestCount = 0;
  26. function showFullScreenLoading() {
  27. if (needLoadingRequestCount === 0) {
  28. startLoading();
  29. }
  30. needLoadingRequestCount++;
  31. };
  32. function tryHideFullScreenLoading() {
  33. if (needLoadingRequestCount <= 0) return;
  34. needLoadingRequestCount--;
  35. if (needLoadingRequestCount === 0) {
  36. endLoading();
  37. }
  38. };
  39. // 请求拦截
  40. axios.interceptors.request.use(config => {
  41. let token = "";
  42. showFullScreenLoading();
  43. if(VueCookies.isKey('userinfo')) {
  44. const USERINFO = VueCookies.get('userinfo');
  45. if(config.method == 'get') {
  46. token = Base64.encode(USERINFO.token + '|' + moment().utc().format('YYY-MM-DD HH:mm:ss' + '|' + JSON.stringify(config.params)));
  47. config.params.hospitalId = USERINFO.hospitalId;
  48. } else {
  49. token = Base64.encode(USERINFO.token + '|' + moment().utc().format('YYY-MM-DD HH:mm:ss' + '|' + JSON.stringify(config.data)));
  50. config.data.hospitalId = USERINFO.hospitalId;
  51. }
  52. let TOKENSTART = token.slice(0,10),
  53. TOKENEND = token.slice(10);
  54. token = TOKENEND + TOKENSTART;
  55. config.headers['token'] = token;
  56. }
  57. return config;
  58. }, err => {
  59. tryHideFullScreenLoading();
  60. Message.error({ message: '请求超时!' });
  61. return Promise.resolve(err);
  62. })
  63. // 响应拦截
  64. axios.interceptors.response.use(res => {
  65. tryHideFullScreenLoading();
  66. switch(res.data.code) {
  67. case 200:
  68. return res.data.result;
  69. case 401:
  70. router.push('/login');
  71. VueCookies.remove('userinfo');
  72. return Promise.reject(res);
  73. case 201:
  74. Message.error({ message: res.data.msg });
  75. return Promise.reject(res);
  76. default :
  77. return Promise.reject(res);
  78. }
  79. }, err => {
  80. tryHideFullScreenLoading();
  81. if(!err.response.status) {
  82. return false;
  83. }
  84. switch(err.response.status) {
  85. case 504:
  86. Message.error({ message: '服务器被吃了⊙﹏⊙∥' });
  87. break;
  88. case 404:
  89. Message.error({ message: '服务器被吃了⊙﹏⊙∥' });
  90. break;
  91. case 403:
  92. Message.error({ message: '权限不足,请联系管理员!' });
  93. break;
  94. default:
  95. return Promise.reject(err);
  96. }
  97. })
  98. axios.defaults.timeout = 300000;// 请求超时5fen
    // RequestBody
  99. export const postJsonRequest = (url, params) => {
  100. return axios({
  101. method: 'post',
  102. url: url,
  103. data: params,
  104. headers: {
  105. 'Content-Type': 'application/json',
  106. },
  107. });
  108. }
    // formData
  109. export const postRequest = (url, params) => {
  110. return axios({
  111. method: 'post',
  112. url: url,
  113. data: params,
  114. transformRequest: [function (data) {
  115. let ret = ''
  116. for (let it in data) {
  117. ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
  118. }
  119. return ret
  120. }],
  121. headers: {
  122. 'Content-Type': 'application/x-www-form-urlencoded'
  123. }
  124. });
  125. }
  126. export const getRequest = (url, data = '') => {
  127. return axios({
  128. method: 'get',
  129. params: data,
  130. url: url,
  131. });
  132. }
Get请求的话是不需要进行设置的,因为get请求回默认将参数放在params中,post请求的话会有两个,所以我们这里讲post请求封装了两份。
 
 
引至 https://www.cnblogs.com/bgwhite/p/9964864.html

猜你喜欢

转载自www.cnblogs.com/braveLN/p/11199862.html
今日推荐