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

news2025/1/18 19:06:32

目录

了解几个Content-type类型

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

第二种:multipart/form-data

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

第一步新建request.js文件

第二步新建services/apiUrl文件

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

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


了解几个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 })) 

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

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

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

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

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


 文件存放目录:

第一步新建request.js文件

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

1.定义request方法

2.创建axios实例

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

4.导出request

/*
 * 接口请求封装
 */
import axios from "axios"; // 引入axios
import config from 'utils/config.js'
import com from 'utils/common.js'
import { Message } from 'element-ui';
import Qs from 'qs'
import loading from 'utils/loading'

let options = {};
const NEED_TRANSLATE = [ // 需要转转字符串
    'supply/purchase/orderVoided',
    'upload-file/upload/files/delete',
    'supply/issuing/detail',
    'supply/costManage/confirmDeposit',
    'supply/logistics/notifyArrivalTime',
    'supply/logistics/detail'
];

const request = async function (opt) {
    try {
        options = Object.assign({
                method: "get", // 默认get 请求
            },
            opt //参数
        );
        const res = await instance(options);
        return res;
    } catch (err) {
        return err;
    }
};

// 创建axios实例
const instance = axios.create({
    baseURL: config.baseUrl,
    timeout: 6000, // 请求超时日期
});

// 实例添加请求拦截器
instance.interceptors.request.use((requestConfig) => {

    loading.showLoading();
    if (/get/i.test(requestConfig.method)) { // 判断get请求
        requestConfig.params = requestConfig.params || {};
        requestConfig.params.timeStamp = Date.parse(new Date()) / 1000; // 添加日期戳
    }

    const token = com.getSession(config.USER_TOKEN);
    const userId = com.getSession(config.USER_ID);
    if (!com.isNullOrEmpty(token)) {
        requestConfig.headers.Authorization = 'bearer ' + token;
    }
    if (!com.isNullOrEmpty(userId)) {
        requestConfig.headers['user-id'] = userId
    }

    if (NEED_TRANSLATE.find(n => requestConfig.url.indexOf(n) > -1)) {
        requestConfig.data = Qs.stringify(requestConfig.data)
        // requestConfig.headers["Content-type"] = "application/x-www-form-urlencoded"
    }

    return Promise.resolve(requestConfig);
}, (error) => {
    // 对请求错误做处理...
    return Promise.reject(error);
});

// 实例添加响应拦截器
instance.interceptors.response.use((response) => {

    loading.hideLoading();
    if ((response.status >= 200 && response.status < 300) || response.status === 304) {
        // 如果http状态码正常,则直接返回数据
        return response.data;
    } 
}, (error) => {
    // 对响应错误做处理...
    loading.hideLoading();
    if (error.response) {
        switch(error.response.status){
            case 401:
                Message.error({
                    duration: 1500,
                    message: error.response.data.message,
                    onClose() {
                        $com.jumpTodoOffical('expiredToken');
                    }
                })
                break;
            case 402:
                break;
            case 403:
                break;
            default: 
                Message.error({
                    duration: 1500,
                    message: error.response.data.message,
                })
                break;
        }
        return Promise.reject(error.response);
    }
});

export default request;

第二步新建services/apiUrl文件

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

/*
* api接口地址汇总
*/


export const apiUrl = {
  // 用户权限
  apiPermission: function(param){
    return `system/menu/${param.name}/2`
  },

  // 用户认证列表
  apiAuthList: 'platform/customer/authList',
  

  // 用户认证提交审核
  apiAuthCustomerSave: 'platform/customer/saveApproval',

  // 船运信息-删除
  apiShippingDel: function(params){
    return `supply/shipping/${params.id}`
  },
}

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

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

services/index.js文件:

/*
* 生成接口,并将接口挂载到vue的原型上
*/

import Vue from 'vue';
import request from './request';
import { apiUrl } from './apiUrl';

const services = {};

Object.entries(apiUrl).forEach((item) => {
  services[item[0]] = function (options = {},urlParams={}) {
    return request(Object.assign({
      url: typeof(item[1])==='function'? item[1](urlParams):item[1]
    }, options))
  }
})

// 将services挂载到vue的原型上
// 业务中引用的方法:this.$services.接口名(小驼峰)
Object.defineProperty(Vue.prototype, '$services', {
  value: services
});

export default services;

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

// main.js
import './services'

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

this.$services.接口名

// get 请求
this.$services.apiAuthList({
     method: 'get',
     params: {
        orgId: this.paramsInfo.orgId,
        creditId: this.paramsInfo.creditId,
     }
}).then(res => {
     if (res && res.code === 2000) {
         //todo
     } else {
          this.$message.error({
             message: res.message
          })
     }
})

// post请求
this.$services.apiAuthCustomerSave({
      method: 'post',
      data: {
          orgId: this.paramsInfo.orgId,
          creditId: this.paramsInfo.creditId,
      }
}).then(res => {
   if (res && res.code === 2000) {
        //todo
   } else {
       this.$message.error({
           message: res.message
       })
   }
})


// 这里通过一个多余的{} 为url接口传递参数
 this.$services.apiShippingDel({
      method: "delete",
   },{
      id: row.id
   }).then((res) => {
          if (res && res.code === 2000) {
                this.$message.success("删除成功");
                this.getPageList();
          } else {
                this.$message.error(res && res.message);
          }
   });

搞定🤝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端】深入浅出缓存原理

缓存的基本原理 对于前端来说&#xff0c;缓存主要分为浏览器缓存&#xff08;比如 localStorage、sessionStorage、cookie等等&#xff09;以及http缓存&#xff0c;也是本文主要讲述的。 当然叫法也不一样&#xff0c;比如客户端缓存大概包括浏览器缓存和http缓存 所谓htt…

手撕前端面试题【javascript~文件扩展名、分隔符、单向绑定、判断版本、深浅拷贝、内存泄露等】

前端的那些基本标签&#x1f353;&#x1f353; 直角三角形&#x1f353;&#x1f353;文件扩展名&#x1f353;&#x1f353;分隔符&#x1f353;&#x1f353;单向绑定&#x1f353;&#x1f353;创建数组&#x1f353;&#x1f353;判断版本&#x1f353;&#x1f353;什么是…

四、nginx静态文件的配置

1. 根据上节内容的提示&#xff0c;我们知道如何进行nginx的信号控制和命令行控制了。 2. 这节主要是学习nginx的静态文件、缓存、静态文件压缩等相关内容。 一、 配置并访问nginx静态文件 1.1 root配置nginx静态文件地址 在nginx.conf 配置文件中默认使用root配置了nginx静态…

vue项目使用svg图片

&#xff08;svg-sprite-loader以及vue2-svg-icon的使用&#xff09; 第一种方式&#xff1a; 1、安装svg-sprite-loader npm install svg-sprite-loader --save-dev 2、webpack 配置&#xff08;build/webpack.base.conf.js&#xff09; { test: /\.svg$/, loader: svg-spr…

小程序表单校验uni-forms正确使用方式及避坑指南

小程序表单校验uni-forms正确使用方式及避坑指南一、前言二、成果展示三、uni-forms即时校验四、uni-forms自定义校验规则五、uni-forms异步校验六、完整示例源码七、最后&#xff0c;点个赞一、前言 小程序上使用表单理应是很常用&#xff0c;也很必须的功能&#xff0c;因为…

【微信小程序】自定义组件

组件的创建与引用 1.1、创建组件 &#xff08;1&#xff09;在项目的根目录中&#xff0c;鼠标右键&#xff0c;创建 components > test 文件夹 &#xff08;2&#xff09;在新建的 components > test 文件夹中&#xff0c;鼠标右键&#xff0c;点击“新建 Component” …

通过JavaScript、css、H5 实现简单的tab栏的切换和复用

目录 一、效果展示 二、实现的大致原理 三、H5的布局 四、CSS样式 五、JS代码内容 六、完整代码 一、效果展示 二、实现的大致原理 1.我们先通过css 和h5布局得到最基本的tab栏样式&#xff08;有代码参考&#xff09; 2.在获得样式&#xff0c;给我们所需要点击的目标设…

yolov5部署+微信小程序前端展示

分为yolov5项目部署和微信小程序两部分&#xff0c;先介绍微信小程序前端展示flask后端&#xff0c;之后介绍项目部署这部分。 一、先上效果图 1. 点击选择图片&#xff0c;调用摄像头选择图片 2.选择图片之后&#xff0c;点击开始检测&#xff0c;然后返回结果 ​​​​​​…

CTF----Web真零基础入门

目录 前置知识导图&#xff1a; ​TCP/IP体系结构&#xff08;IP和端口&#xff09;&#xff1a; IP是什么&#xff1a;是计算机在互联网上的唯一标识&#xff08;坐标&#xff0c;代号&#xff09;&#xff0c;用于在互联网中寻找计算机。 内网&#xff08;局域网&#xf…

JSONP解决跨域问题

一、什么是同源 概念&#xff1a;如果两个页面的协议、域名和端口都相同&#xff0c;则这两个页面具有相同的源。 二、什么是同源策略 概念&#xff1a;是浏览器提供的一个安全功能。 三、什么是跨域 概念&#xff1a;同源指的是两个URL的协议、域名、端口号一致&#xff0c…

前端开发调式必备技能F12开发者工具之Elements(元素)面板,详细图解带流程【第一部分】

目录 一、进入浏览器开发工具的几种方式 二、Elements&#xff08;元素&#xff09;面板 左侧区域 右侧区域 计算样式 事件监听器 大家好&#xff01;我是爷爷的茶七里香&#xff0c;这个名字有没有让你想起周董的歌捏&#xff1f;好了&#xff0c;废话不多说&#xff0c;开始今…

项目实训记录(十二)——el-table-column根据条件修改字体颜色

目录 一、干了什么&#xff1f; 二、问题和解决方法 1. el-table-column根据条件修改字体颜色 2.问题 总结 一、干了什么&#xff1f; 本周要完成数据去重工作和前端的完善。 清理工作 主要是来删除用户插入的重复数据。由管理员决定表是否允许重复数据。如果用户上传的表不允…

vue3 自定义全局loading组件 (PC和移动端都非常适用)

前言 在开发的过程中&#xff0c;点击提交按钮&#xff0c;或者是一些其它场景总会遇到loading加载框&#xff0c;PC的一些ui库也没有这样的加载框&#xff0c;无法满足业务需求&#xff0c;因此可以自己自定义一个&#xff0c;实现过程如下。 效果图&#xff08;loading样式…

个人博客小程序

文章目录1.前言2.首页博客数据展示3.用data中的数据渲染博客展示4.使用云数据库创建集合blogs5.读取数据库中的数据6.创建添加博客页面1.前言 这篇文章详细的介绍了个人博客小程序的云开发流程&#xff0c;包括博客展示页面&#xff0c;添加博客页面的创建&#xff0c;以及云函…

pm2基本使用

1.pm2的基本介绍 pm2是node的进程管理器&#xff0c;利用它可以简化node任务的管理,且内置了许多功能,常用于后台脚本管理。 pm2特性 自带热部署 - - - 当源文件更新 线上项目也会自动重启后台运行 - - - 不会占用实时窗口 会在后台运行服务信息查看 - - - 查看运行中程序的…

Vue权限控制

此文章根据视频教程进行整理前端面试官必问系列-后台系统的权限控制与管理&#xff0c;建议搭配视频教程一起食用效果更佳 目录 1、权限相关概念 1.1、权限的分类 后端权限 前端权限 1.2 、前端权限的意义 降低非法操作的可能性 尽量减少不必要请求&#xff0c;减轻服务…

VUE跨域、常用解决跨域的方法

当我们遇到请求后台接口遇到 Access-Control-Allow-Origin 时&#xff0c;那说明跨域了。 跨域是因为浏览器的同源策略所导致&#xff0c;同源策略&#xff08;Same origin policy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;同源是指&…

〖大前端 - 基础入门三大核心之CSS篇⑱〗- CSS中的背景

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费开放&#xff0c;购买任意白宝书体系化专栏可加入TFS-CLUB 私域社区。福利&#xff1a;除了通过订阅"白宝书系列专栏"加入社区获取所有付费专栏的内容之外&#xff0c;还可以通过加入星荐…

【React Router v6】路由组件传参params/search/state(router v6)

欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t 框架 React框架 Reac

react-router v6 如何实现动态路由?

前言 最近在肝一个后台管理项目&#xff0c;用的是react18 ts 路由用的是v6&#xff0c;当需要实现根据权限动态加载路由表时&#xff0c;遇到了不少问题。 v6相比于v5做了一系列改动&#xff0c;通过路由表进行映射就是一个很好的改变&#xff08;个人认为&#xff09;&…