axios请求大全

news2024/9/23 17:25:26

本文讲解axios封装方式以及针对各种后台接口的请求方式

axios的介绍和基础配置可以看这个文档: 起步 | Axios中文文档 | Axios中文网

axios的封装

axios封装的重点有三个,一是设置全局config,比如请求的基础路径,超时时间等,第二点是在每次请求前往请求头里面塞token,第三点是处理请求的response,如果出错了进行统一的错误处理

//进行axios二次封装:使用请求与响应拦截器
import axios from 'axios'

//第一步:利用axios对象的create方法,去创建axios实例(其他的配置:基础路径、超时的时间)
const request = axios.create({
    //基础路径
    baseURL: 'http://localhost:6689', //基础路径
    timeout: 15000, //超时的时间的设置
})
//第二步:request实例添加请求与响应拦截器
request.interceptors.request.use((config) => {
    //config配置对象,headers属性请求头,经常给服务器端携带公共参数
    config.headers.Authorization = 'authorization'
    //返回配置对象
    return config
})

//第三步:响应拦截器
request.interceptors.response.use(
    (response) => {
        if (response.headers['content-type'] !== 'application/json') {
            // 返回的不是json则由调用方处理
            return response
        }
        if (response.data.status == 200) {
            // 请求成功
            return response.data
        } else if (response.data.status == 401) {
            // 未登录
            // todo 重新登录
            return Promise.reject(response.data)
        } else {
            // 弹出错误提示
            console.error(response.data.message)
            return Promise.reject(response.data)
        }
    },
    (error) => {
        //失败回调:处理http网络错误的
        //定义一个变量:存储网络错误信息
        let message = ''
        if (error.message.includes('timeout')) {
            message = '请求接口服务超时'
        } else if (error.message.includes('Network Error')) {
            message = '网络错误'
        }
        //http状态码
        if (error.response) {
            const status = error.response.status
            switch (status) {
                case 401:
                    message = 'TOKEN过期'
                    break
                case 403:
                    message = '无权访问'
                    break
                case 404:
                    message = '请求地址错误'
                    break
                case 500:
                    message = '服务器出现问题'
                    break
                default:
                    message = '网络出现问题'
                    break
            }
        }
        if (!message) message = '未知错误'
        //提示错误信息
        console.log(message)
        return Promise.reject(error)
    },
)

//对外暴露
export default request

发送GET请求

我们先来看swagger文档,这个请求是get请求,传递的参数是query,也就是跟在url后面的键值对,类似于?key1=val1&key2=val2这种

 

 实现代码如下,request.js就是上面封装的axios,下面就不重复说了,发送get请求重点是两个,一个是method:get,一个是用params来传递参数

import request from "@/utils/request.js";

async function doGet() {
  const params = {
    id: 1,
    name: '研发部'
  }
  // 使用params传递query参数
  const res = await request({
    url: '/axios/listAll',
    method: 'get',
    params //等同于params:params
  })
  console.log(res)
}

我们来看下network里面的数据,发送params参数会把请求参数拼接到url后面,如果是中文字符,则进行url编码

发送POST请求,数据类型为json 

看下接口文档,method为post,数据类型为json

 post传递json需要把传递的数据放入请求体(request body)里面,并且把content-type设置成application/json,所幸axios使用起来很简单,只需要把method设置成post,使用data参数传递就行了

async function doPostJson() {
  const data = {
    id: 1,
    name: '研发部'
  }
  // json使用data参数传递
  const res = await request({
    url: '/axios/add',
    method: 'post',
    data //等同于data:data
  })
  console.log(res)
}

下图是network中发送的请求头

 

发送的请求体

 

发送POST请求,数据类型为form

post请求,数据类型为form也挺常见的

 方式一,通过query传参,不推荐

第一种方式通过query传参,就是参数跟在url后面,这种方式有两个问题,一是url长度有限制,chrome是8千个字符,post请求一般传递的数据都比较大,二是参数跟在url后面很容易被识别,有一定的安全风险,代码如下:

async function doPostQuery() {
  const params = {
    username: 'admin',
    password: '123456'
  }
  // form可以使用params来传参
  const res = await request({
    url: '/axios/login',
    method: 'post',
    params //等同于params:params
  })
  console.log(res)
}

方式二,通过form传参,推荐

 第二种方式是把请求数据放入request body中,可以解决上面两个问题

这种方式需要使用qs库,先安装qs,然后使用data传参,区别就是数据要先通过qs.stringify转换成form

npm install qs
import qs from 'qs'
async function doPostForm() {
  const data = {
    username: 'admin',
    password: '123456'
  }
  // 转成form后传参
  const res = await request({
    url: '/axios/login',
    method: 'post',
    data: qs.stringify(data)
  })
  console.log(res)
}

发送PUT请求,数据类型为json

发送put请求跟post是一样的,都是通过data来传递参数,唯一的区别是method改成put就行了

 

async function doPutJson() {
  const data = {
    id: 1,
    name: '研发部'
  }
  // json使用data参数传递
  const res = await request({
    url: '/axios/update',
    method: 'put',
    data //等同于data:data
  })
  console.log(res)
}

 

 发送PUT请求,数据类型为form

这个可以参考发送post请求,数据类型为form那段,只要method改成put,其他都一样

 发送DELETE请求,数据类型为path

delete请求是用来做删除的,一般会把id放在请求路径中

async function doDeletePath() {
  const id = 1
  // 参数直接拼接在路径后面
  const res = await request({
    url: '/axios/delete/' + id,
    method: 'delete',
  })
  console.log(res)
}

 

发送DELETE请求,数据类型为form

 可以通过query的方式传递参数

async function doDeleteForm() {
  const params = {
    ids: [1,2,3].join(',')
  }
  // 参数直接拼接在路径后面
  const res = await request({
    url: '/axios/batchDelete',
    method: 'delete',
    params
  })
  console.log(res)
}

 

 发送DELETE请求,数据类型为json

method为delete,使用data传递数据

async function doDeleteJson() {
  const data = {
    ids: [1,2,3]
  }
  // 参数直接拼接在路径后面
  const res = await request({
    url: '/axios/batchDeleteJson',
    method: 'delete',
    data
  })
  console.log(res)
}

 上传文件

axios上传文件的要点是要用FormData对象来组装数据,请求头的Content-Type要设置成multipart/form-data,使用data传递数据表示数据放在request body里面

async function doUpload() {
  const formData = new FormData();
  // 把input file里面的文件放入formData,如果后台要求数组,可以多次调用append
  formData.append("file", fileRef.value.files[0])
  // 放入其他数据
  formData.append("id", 1)
  formData.append("name", "研发部")
  // 参数直接拼接在路径后面
  const res = await request({
    url: '/axios/uploadFile',
    method: 'post',
    data: formData
  })
  console.log(res)
}

下载文件 

方式一,window.location.href

如果需要下载的是一个url,则只需要window.location.href=url就行了,但是这种方式有几个问题,一是如果url里面是图片,txt等浏览器可以打开的内容,则会直接打开,不会下载,二是这种方式只支持get请求,如果需要通过post等形式下载则不适用,三是这种方式没法在header里面加token,四是这种方式没法指定文件名,后台指定什么文件名就是什么

方式二,axios下载

axios的下载方式就灵活很多,可以解决上面提到的那些问题,把请求的responseType指定成blob,然后从返回的头字段中解析中文件名,最后通过新建一个看不见的a标签来实现下载

async function doDownload() {
  // 参数直接拼接在路径后面
  const res = await request({
    url: '/axios/downloadFile',
    method: 'post',
    responseType: 'blob' // 重要:指定响应类型为blob
  })
  downloadFile(res.data, getAttachmentName(res.headers))
}

function getAttachmentName(headers) {
  let fileName = headers['content-disposition']?.match(/filename=(.*)/)[1]
  if (fileName) {
    fileName = decodeURI(fileName)
  } else {
    //此处表示后台没有设置响应头 content-disposition,请根据业务场景自行处理
    fileName = "download"
  }
  return fileName
}
function downloadFile(file, fileName) {
  //转成blob对象
  const blob = new Blob([file], { type: 'application/octet-stream' })
  if (typeof window.navigator.msSaveBlob !== 'undefined') {
    window.navigator.msSaveBlob(blob, fileName)
  } else {
    // 创建a标签去下载
    const blobURL = window.URL.createObjectURL(blob)
    const tempLink = document.createElement('a')
    tempLink.style.display = 'none'
    tempLink.href = blobURL
    tempLink.setAttribute('download', fileName)
    if (typeof tempLink.download === 'undefined') {
      tempLink.setAttribute('target', '_blank')
    }
    document.body.appendChild(tempLink)
    tempLink.click()
    document.body.removeChild(tempLink)
    window.URL.revokeObjectURL(blobURL)
  }
}

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

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

相关文章

【数据结构】二叉树——顺序结构——堆及其实现

一、树 1.1、树的概念和结构 树是一种非线性的数据结构,它是由n(n>0)个有限节点组成的一个具有层次关系的集合。 树有一个特殊的节点,称为根节点,根节点没有前驱结点。 除根节点外,其余部分被分为M&…

Mysql - 索引

目录 一、存储引擎 二、索引 索引结构 索引分类 索引语法 联合索引 前缀索引 索引使用规则 最左前缀法则 范围查询使索引失效 字段做运算操作索引失效 字符串字段不加单引号索引失效 字段做前模糊查询索引失效 or连接条件索引失效 数据发布情况索引失效 指定使用…

Matlab编程资源库(1)选择结构

一、if语句 在 MATLAB 中, if 语句有 3 种格式。 (1) 单分支 if 语句: if 条件 语句组 end 当条件成立时,则执行语句组,执行完之后, 继续执行 if 语句的后继语句,若条件不成 立,则直接执…

什么是PCB流锡槽焊盘/C型焊盘,如何设计?-捷配笔记

在PCB进行机器组装器件时(如波峰焊),为了防止部分需要二次焊接的元器件的焊盘堵孔,就需要在PCB焊盘上面开个过锡槽,以便过波峰焊时,这些焊锡会流掉。开流锡槽就是在焊盘裸铜(敷锡)部…

setsockopt选项对tcp速度

GPT-4 (OpenAI) 每个setsockopt调用都涉及到一个套接字描述符,一个指定网络层的常数(如IPPROTO_IP, IPPROTO_TCP, IPPROTO_IPV6, SOL_SOCKET等),一个指定需配置的选项的常数,一个指向配置值的指针,以及那个…

04-数据库MySQL

一、项目要求 二、项目过程介绍 1、新建数据库 2、新建表 3、处理表 1.修改student 表中年龄(sage)字段属性,数据类型由int 改变为smallint 2.为Course表中Cno 课程号字段设置索引,并查看索引 3.为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引&#xf…

20分钟上手新版Skywalking 9.x APM监控系统

Skywalking https://skywalking.apache.org/ Skywalking是专为微服务、云原生和基于容器的(Kubernetes)架构设计的分布式系统性能监控工具。 Skywalking关键特性 ● 分布式跟踪 ○ 端到端分布式跟踪。服务拓扑分析、以服务为中心的可观察性和API仪表板。…

英迈中国与 Splashtop 正式达成战略合作协议

2024年7月23日,英迈中国与 Splashtop 正式达成战略合作协议,英迈中国正式成为其在中国区的战略合作伙伴。此次合作将结合 Splashtop 先进的远程桌面控制技术和英迈在技术服务与供应链管理领域的专业优势,为中国地区的用户带来更加安全的远程访…

Android TabLayout的简单用法

TabLayout 注意这里添加tab,使用binding.tabLayout.newTab()进行创建 private fun initTabs() {val tab binding.tabLayout.newTab()tab.text "模板库"binding.tabLayout.addTab(tab)binding.tabLayout.addOnTabSelectedListener(object : TabLayout.On…

【开源库编译 | zlib】 zlib库最新版本(zlib-1.3.1)在Ubuntu(Linux)系统下的 编译 、交叉编译(移植)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

VSCode | 修改编辑器注释的颜色

1 打开VsCode的设置进入settings.json 2 添加如下代码 "editor.tokenColorCustomizations": {"comments": "#17e917"},3 保存即可生效

第十四届蓝桥杯省赛C++C组C题【三国游戏】题解(AC)

解题思路 由于三种国家都有获胜的可能,所以我们需要分别枚举 X , Y , Z X,Y,Z X,Y,Z 获胜的情况。 设 X X X 获胜,那么对于第 i i i 个事件的贡献为 a [ i ] − ( b [ i ] c [ i ] ) a[i]-(b[i]c[i]) a[i]−(b[i]c[i]),根据贪心的策略…

黑马JavaWeb企业级开发(知识清单)03——HTML实现正文:排版(音视频、换行、段落)、布局标签(div、span)、盒子模型

文章目录 前言一、正文排版1. 视频标签: < video >2. 音频标签: < audio >3. 换行标签: < br >4. 段落标签 < p >5. vscode实现 二、布局1. 盒子模型2. 布局标签< div >和< span >3. VScode实现 三、源代码和运行结果总结 前言 本篇文章是…

鸿蒙HarmonyOS【应用开发一、鸿蒙简介】

✍️作者简介&#xff1a;小北编程&#xff08;专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f…

CSS实现的扫光效果组件

theme: lilsnake 图片和内容如有侵权&#xff0c;及时与我联系~ 详细内容与注释&#xff1a; CSS实现的扫光效果组件 代码 技术栈与框架 Vue3 CSS 扫光效果的原理 扫光效果的原理就是从左到右无限循环的一个位移动画 实现方式 适配文字扫光效果的css .shark-box { …

STL常用算法——常用查找算法

自定义类型都要用仿函数判断 1.find() class Person { public:Person(string name,int age){this->m_Name name;this->m_Age age;}bool operator(const Person &p)//重载operator{if (this->m_Name p.m_Name && this->m_Age p.m_Age){return true;…

CSDN的动态在哪里

模板 文章目录 模板 如果对你有帮助&#xff0c;就点赞收藏把&#xff01;(&#xff61;&#xff65;ω&#xff65;&#xff61;)&#xff89;♡ 早上发了一个动态&#xff0c;这是我第一次发动态&#xff0c;然后却发现我不知道动态在哪打开 我找了好几个地方&#xff0c;然后…

FPGA实验6: 有时钟使能两位十进制计数器的设计

一、实验目的与要求 1.. 熟练掌握使用原理图设计较复杂电路&#xff1b; 2. 学习原理图设计中总线的表示以及使用方法。 二、实验原理 运用Quartus II 集成环境下的图形设计方法设计有时钟使能的两位十进制计数器。进行波形仿真和分析、引脚分配并下载到实验设备上进行功能…

JS进阶之以题悟道(一)列表内容排序再渲染

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 正则表达式outerHTMLjoinmap 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-wid…

py3.7.4离线安装openpyxl等错误,无法安装openpyxl...

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…