0


vue 基于axios封装request接口请求——request.js文件

了解几个Content-type类型

Content-type类型:代表发送端(客户端|服务器)发送的实体数据的数据类型

格式:Content-Type:type/subtype ;parameter

  • 要根据服务端定而定,否则一般情况无需做设置改动

/**

  • get请求不存在设置Content-Type

  • 只有post和put用到Content-Type

  • content-type会根据参数的类型会自动有对应的值,一般无需设置

*/

第一种:application/json;charset=UTF-8

默认行参 axios.post(url,{a:1,b:2})

若不标注Content-type类型,则content-type默认是application/json;charset=UTF-8类型

第二种:multipart/form-data

多用于图片上传

let formData = new FormData() ;

formData.append('a',1);

formData.append('b',2)

第三种: application/x-www-form-urlencoded

let data = {a:1,b:2}; axios.post(url,qs.stringify({ data }))

例如服务端需要的类型为第三种,此时只需要统一设置请求前将参数变成字符串即可

  1. // `transformRequest` 允许在向服务器发送前,修改请求数据
  2. // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  3. // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
  4. transformRequest: [function (data, headers) {
  5. // 对 data 进行任意转换处理
  6. return data;
  7. }],

transformRequest: [ function (data) { return Qs.stringify(data) } ];

还可查阅axios中文文档|axios中文网 | axios

还可查阅这篇文章-leoss.H


文件存放目录:

第一步新建request.js文件

在serveces目录下新建request.js文件

1.定义request方法

2.创建axios实例

  1. 为实例添加拦截器(在请求或响应被
    1. then
    1. catch
    处理前拦截它们)

4.导出request

  1. /*
  2. * 接口请求封装
  3. */
  4. import axios from "axios"; // 引入axios
  5. import config from 'utils/config.js'
  6. import com from 'utils/common.js'
  7. import { Message } from 'element-ui';
  8. import Qs from 'qs'
  9. import loading from 'utils/loading'
  10. let options = {};
  11. const NEED_TRANSLATE = [ // 需要转转字符串
  12. 'supply/purchase/orderVoided',
  13. 'upload-file/upload/files/delete',
  14. 'supply/issuing/detail',
  15. 'supply/costManage/confirmDeposit',
  16. 'supply/logistics/notifyArrivalTime',
  17. 'supply/logistics/detail'
  18. ];
  19. const request = async function (opt) {
  20. try {
  21. options = Object.assign({
  22. method: "get", // 默认get 请求
  23. },
  24. opt //参数
  25. );
  26. const res = await instance(options);
  27. return res;
  28. } catch (err) {
  29. return err;
  30. }
  31. };
  32. // 创建axios实例
  33. const instance = axios.create({
  34. baseURL: config.baseUrl,
  35. timeout: 6000, // 请求超时日期
  36. });
  37. // 实例添加请求拦截器
  38. instance.interceptors.request.use((requestConfig) => {
  39. loading.showLoading();
  40. if (/get/i.test(requestConfig.method)) { // 判断get请求
  41. requestConfig.params = requestConfig.params || {};
  42. requestConfig.params.timeStamp = Date.parse(new Date()) / 1000; // 添加日期戳
  43. }
  44. const token = com.getSession(config.USER_TOKEN);
  45. const userId = com.getSession(config.USER_ID);
  46. if (!com.isNullOrEmpty(token)) {
  47. requestConfig.headers.Authorization = 'bearer ' + token;
  48. }
  49. if (!com.isNullOrEmpty(userId)) {
  50. requestConfig.headers['user-id'] = userId
  51. }
  52. if (NEED_TRANSLATE.find(n => requestConfig.url.indexOf(n) > -1)) {
  53. requestConfig.data = Qs.stringify(requestConfig.data)
  54. // requestConfig.headers["Content-type"] = "application/x-www-form-urlencoded"
  55. }
  56. return Promise.resolve(requestConfig);
  57. }, (error) => {
  58. // 对请求错误做处理...
  59. return Promise.reject(error);
  60. });
  61. // 实例添加响应拦截器
  62. instance.interceptors.response.use((response) => {
  63. loading.hideLoading();
  64. if ((response.status >= 200 && response.status < 300) || response.status === 304) {
  65. // 如果http状态码正常,则直接返回数据
  66. return response.data;
  67. }
  68. }, (error) => {
  69. // 对响应错误做处理...
  70. loading.hideLoading();
  71. if (error.response) {
  72. switch(error.response.status){
  73. case 401:
  74. Message.error({
  75. duration: 1500,
  76. message: error.response.data.message,
  77. onClose() {
  78. $com.jumpTodoOffical('expiredToken');
  79. }
  80. })
  81. break;
  82. case 402:
  83. break;
  84. case 403:
  85. break;
  86. default:
  87. Message.error({
  88. duration: 1500,
  89. message: error.response.data.message,
  90. })
  91. break;
  92. }
  93. return Promise.reject(error.response);
  94. }
  95. });
  96. export default request;

第二步新建services/apiUrl文件

该文件是api接口地址的汇总

  1. /*
  2. * api接口地址汇总
  3. */
  4. export const apiUrl = {
  5. // 用户权限
  6. apiPermission: function(param){
  7. return `system/menu/${param.name}/2`
  8. },
  9. // 用户认证列表
  10. apiAuthList: 'platform/customer/authList',
  11. // 用户认证提交审核
  12. apiAuthCustomerSave: 'platform/customer/saveApproval',
  13. // 船运信息-删除
  14. apiShippingDel: function(params){
  15. return `supply/shipping/${params.id}`
  16. },
  17. }

第三步新建services/index.js文件

在services目录下新建index.js,该js会将API接口和request相互关联起来,并挂载在vue原型上。

services/index.js文件:

  1. /*
  2. * 生成接口,并将接口挂载到vue的原型上
  3. */
  4. import Vue from 'vue';
  5. import request from './request';
  6. import { apiUrl } from './apiUrl';
  7. const services = {};
  8. Object.entries(apiUrl).forEach((item) => {
  9. services[item[0]] = function (options = {},urlParams={}) {
  10. return request(Object.assign({
  11. url: typeof(item[1])==='function'? item[1](urlParams):item[1]
  12. }, options))
  13. }
  14. })
  15. // 将services挂载到vue的原型上
  16. // 业务中引用的方法:this.$services.接口名(小驼峰)
  17. Object.defineProperty(Vue.prototype, '$services', {
  18. value: services
  19. });
  20. export default services;

在mian.js 中引入services/index.js

  1. // main.js
  2. import './services'

最后如何使用封装好的request请求

this.$services.接口名

  1. // get 请求
  2. this.$services.apiAuthList({
  3. method: 'get',
  4. params: {
  5. orgId: this.paramsInfo.orgId,
  6. creditId: this.paramsInfo.creditId,
  7. }
  8. }).then(res => {
  9. if (res && res.code === 2000) {
  10. //todo
  11. } else {
  12. this.$message.error({
  13. message: res.message
  14. })
  15. }
  16. })
  17. // post请求
  18. this.$services.apiAuthCustomerSave({
  19. method: 'post',
  20. data: {
  21. orgId: this.paramsInfo.orgId,
  22. creditId: this.paramsInfo.creditId,
  23. }
  24. }).then(res => {
  25. if (res && res.code === 2000) {
  26. //todo
  27. } else {
  28. this.$message.error({
  29. message: res.message
  30. })
  31. }
  32. })
  33. // 这里通过一个多余的{} 为url接口传递参数
  34. this.$services.apiShippingDel({
  35. method: "delete",
  36. },{
  37. id: row.id
  38. }).then((res) => {
  39. if (res && res.code === 2000) {
  40. this.$message.success("删除成功");
  41. this.getPageList();
  42. } else {
  43. this.$message.error(res && res.message);
  44. }
  45. });

搞定🤝

标签: javascript 前端 axios

本文转载自: https://blog.csdn.net/q1ngqingsky/article/details/122845653
版权归原作者 woowen! 所有, 如有侵权,请联系我们删除。

“vue 基于axios封装request接口请求——request.js文件”的评论:

还没有评论