axios踩坑,不同版本默认Content-Type不同

news2024/11/19 16:42:55

文章目录

  • 1、请求封装
  • 2、问题
    • axios 0.21源码
    • axios 1.2源码
  • 总结

1、请求封装

封装代码:

/**axios封装
 * 请求拦截、相应拦截、错误统一处理
 */
import axios from 'axios'
import QS from 'qs';
import { Message } from 'element-ui'

// 环境的切换
if (process.env.NODE_ENV == 'development') {
  axios.defaults.baseURL = '/Api'
} else if (process.env.NODE_ENV == 'production') {
  axios.defaults.baseURL = '/pfps'
}

// 请求超时时间
axios.defaults.timeout = 15000
// post请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
    const token = localStorage.getItem('token')
    token ? (config.headers.Token = token) : null
    config.headers['route'] = localStorage.getItem('route')
    return config
  },
  error => {
    return Promise.error(error)
  }
)

// 响应拦截器
axios.interceptors.response.use(
  response => {
    if (response.status === 200) {
      //更新token
      if (response.headers.token) {
        localStorage.setItem('token', response.headers.token)
      }
      return Promise.resolve(response)
    } else {
      return Promise.reject(response)
    }
  },
  //服务器状态码不是200的情况
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        case 401:
          Message({
            showClose: true,
            message: '未登录',
          })
          break
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token对象
        // 跳转登录页面
        case 403:
          Message({
            showClose: true,
            message: '登录过期,请重新登录',
          })
          // 清除token
          localStorage.removeItem('token')
          break
        // 404请求不存在
        case 404:
          Message({
            showClose: true,
            message: '网络请求不存在',
          })
          break
        case 500:
          Message({
            showClose: true,
            message: 'Request failed with status code 500',
          })
          break
        // 其他错误,直接抛出错误提示
        default:
          console.log(error)
          Message({
            showClose: true,
            message: error.response.data.message,
          })
      }
      return Promise.reject(error.response)
    } else {
      console.log(error)
      Message({
        showClose: true,
        message: '服务器异常!',
      })
    }
  }
)
/**
 * get方法,对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get(url, params, type) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params,
        responseType: type,
      })
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}
/** 
 * post方法,对应post 序列化请求
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
export function post(url, params) {
  return new Promise((resolve, reject) => {
      axios.post(url, QS.stringify(params))
          .then(res => {
              resolve(res.data);
          })
          .catch(err => {
              reject(err.data)
          })
  });
}
/**
 * post方法,对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function postNormal(url, params) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, params)
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}

/**
 * 文件上传
 */
export function postFile(url, params) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, params, {
        headers: {
          'Content-Type': 'multipart/form-data',
        },
      })
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}

/**
 * 获取json
 */
export const getJson = function (method) {
  return new Promise((resolve, reject) => {
    axios({
      method: 'get',
      url: method,
      dataType: 'json',
      crossDomain: true,
      cache: false,
    })
      .then(res => {
        resolve(res.data)
      })
      .catch(error => {
        reject(error.data)
      })
  })
}

菜鸟感觉这个封装挺好的,可以注释掉下面提到的那一行,然后自己传参设置!

2、问题

菜鸟在和后端交互时,都是使用的postNormal,但是在axios 0.21版本左右时,发现传递给后端的就是json,但是在aioxs 1.2版本左右时,发现传递给后端的就是form-data。

菜鸟就很不理解,明明我们除了传递文件时会用到new FormData、‘Content-Type’: ‘multipart/form-data’,然后将要传递的值append进去FormData之外,其他全是传递的对象,浏览器是为什么会把对象一下理解成JSON、一下理解成FormData的呢?

百思不得其解的菜鸟和导师一起对比代码,发现真的除了版本,基本上没有区别,所以直接看源码:

axios 0.21源码

直接查看axios 0.21的源码,找到node_modules\axios\lib\defaults.js,查看代码
在这里插入图片描述
我们传递的一般都是对象,所以看这个isObject函数,发现里面调用了setContentTypeIfUnset
在这里插入图片描述
发现其实setContentTypeIfUnset就是设置请求头,所以可以看出axios默认请求头就是application/json;charset=utf-8

这时候有人就会问,我不是在最上面写了一段这个话吗?

// post请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

但是其实只要你不是传参传过去的,那么经过axios复杂的判断后,大概率设置是无效的!!!只有传参才是yyds,大神建议也是不要直接设置,最好是你哪里要用就传参改,类似封装的postFile!!!

axios 1.2源码

直接查看axios 1.2源码,找到node_modules\axios\lib\defaults\index.js,查看代码
在这里插入图片描述
在这里插入图片描述
和上面一样看看这个isObject函数,里面的toURLEncodedForm也是设置请求头,但是不一样的是这个会判断你设置请求头没有,要是设置了,就直接按照你设置的返回
在这里插入图片描述
然后application/x-www-form-urlencoded;charset=utf-8 默认就是form-data的数据,所以产生了菜鸟遇见的问题!!!

总结

在这里插入图片描述

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

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

相关文章

大数据必学Java基础(一百二十):Maven工程的介绍与创建

文章目录 Maven工程的介绍与创建 一、Maven工程类型 1、POM工程 2、JAR工程 3、WAR工程

Cookie、Session、Token、JWT详解

Cookie、Session、Token、JWT 什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹…

盖子的c++小课堂——第九讲:文件输入输出

前言 作者:哈咯大家好,我是盖…… 粉丝:更新更新!再不更新我来偷你家马桶盖!快更快更~~ 作者:子的盖…… 粉丝:再不更我真来偷你家马桶盖了昂~~ 作者:……啊!&#…

实用!ArcGIS更改字段名称、类型、顺序的技巧

01需求说明 常规来说。ArcGIS属性表中的字段一旦建立,他的顺序、字段名称、字段的类型是没有办法更改的。 我们在属性表中拖动字段,也只是改变了字段的临时显示顺序。一旦数据重新加载就会显示会原来的顺序。 那么有什么技巧来解决这样的问题&#xff0c…

python爬虫的简单复习1【使用etree进行XPath解析】

一、相关知识1.1 etree的使用1.1.1 编码流程将HTML文本加载到etree对象中调用etree的xpath()函数完成标签定位对标签为所欲为(此时获得的标签其实是xpath()函数返回的对象)1.1.2 环境安装pip install lxml1.1.3 实例化etree对象# 首先导入模块 from lxml…

优思学院|如何更有效地进行5why分析(五问法)?

所谓5-why(五个为什么或五问法),意思是要问五次 "为什么",直到你找到问题的根本原因。具体的过程是:首先确定问题,然后回答"为什么",并记录答案。第二次回答"为什么&q…

虚拟串口及其在串口转以太网中的应用

本文介绍虚拟串口的概念,以及如何在串口转以太网中利用该技术。 1.虚拟串口的概念 虚拟串口是用操作系统的虚拟驱动技术产生的串口(COM口),相对于计算机本身的硬件串口(COM1等)来说虚拟串口并不对应一个物…

贪心法讲解

目录 一、前言 二、贪心法 1、优缺点 2、例子:最少硬币问题 3、贪心和动态规划 4、例题:快乐司机(lanqiaoOJ题号1513) 5、例题:旅行家的预算(lanqiaoOJ题号775) 三、例题 1、翻硬币&am…

数据结构:线性表的类型定义

线性表的类型定义 线性表是最简单、也是最基本的一种线性数据结构。它有两种存储表示方法:顺序表和链表,它的主要基本操作是插入、删除和查找。 线性表是n(n>0)个数据元素的有限序列,表中各个数据元素具有相同特性,即属同一数…

LeetCode 114. 二叉树展开为链表

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 114. 二叉树展开为链表,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 Leet…

2021年大数据挑战赛A题智能运维中的异常检测与趋势预测

2021年大数据挑战赛 A题 智能运维中的异常检测与趋势预测 原题再现: 异常检测(异常诊断/发现)、异常预测、趋势预测,是智能运维中首当其冲需要解决的问题。这类问题是通过业务、系统、产品直接关联的 KPI 业务指标进行分析诊断&…

MD语法 官方参考

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Python小技巧:if __name__ == “__main__“ 的作用

前言 这里是Python小技巧的系列文章。这是第一篇,if __name__ "__main__" 的作用。 在编写Python程序时候,总是习惯性的在文件的末尾添加这么一段代码。 if __name__ "__main__":...至于它的作用是什么,先不管&#x…

内网渗透-src挖掘-外网打点到内网渗透-3层内网渗透测试记录(2)-2023年1月

1、确定目标之后,先进行信息搜集 对目标的先进行ip端口扫描,发现开放了22和80端口 2、访问80端口,为Laravel框架 3、发现该版本为Laravel v8.78.1 (PHP v7.4.3) 漏洞库中搜索,发现该版本的Laravel存在,CVE-2021-3129-Laravel De…

免费格式转换器有哪些?这几款一定要试试

相信在现在的工作中,大家都或多或少需要处理一些文件,有时候我们需要把PDF文件转为word文件,还可能需要将PDF文件转为PPT文件等等,这个时候我们就需要选择一款好用的格式转换器,如果转换文件量比较大的小伙伴们还需要重…

odoo16 修改odoo加载过程

在odoo加载过程中&#xff0c;title处会显示odoo以及odoo标签图片&#xff0c; 所以我们可以进行修改&#xff0c;将其公司化 1. 修改无公司名称时显示字样 <title t-esc"title or Odoo"/> <!--路径&#xff1a;addons/web/views/webclient_templates.xml…

2022.12 青少年软件编程(Python) 等级考试试卷(一级)

2022年12月 青少年软件编程&#xff08;Python&#xff09; 等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a; 100 题数&#xff1a; 37 一、 单选题(共 25 题&#xff0c; 共 50 分) 1. 关于Python语言的注释&#xff0c;以下选项中描述错误的是&#xff1f;&#…

ThinkpadCPU锁频0.4G问题

1.问题描述 Thinkpad型号&#xff1a;E15 CPU&#xff1a;i5-10210U1.6GHz 系统&#xff1a;Win10家庭版 ThinkpadCPU锁频0.4G&#xff0c;具体是过程是今天我需要去楼下打印东西&#xff0c;要带着笔记本电脑&#xff0c;拔掉电源我就去楼下。 刚开始还是好好的&#xff0c;…

PyQt5 serial模块-串口小工具

PyQt5 serial模块-串口小工具串口简述serial模块参数方法使用模板串口工具示例串口简述 异步串行是指UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;通用异步接收/发送。UART是一个并行输入成为串行输出的芯片&#xff0c;通常集成在主…

java 基础练习 圆的面积

问题描述给定圆的半径r&#xff0c;求圆的面积。输入格式输入包含一个整数r&#xff0c;表示圆的半径。输出格式输出一行&#xff0c;包含一个实数&#xff0c;四舍五入保留小数点后7位&#xff0c;表示圆的面积。说明&#xff1a;在本题中&#xff0c;输入是一个整数&#xff…