解决:axios 请求头url传参数组时发生400错误

2024-09-05 02:52

本文主要是介绍解决:axios 请求头url传参数组时发生400错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

  • axios封装的网络请求,url传参时,数组作为参数传递,发生400错误
  • 请求时数组参数url会保留 []

在这里插入图片描述

二、原因

RFC3986:除了 数字 + 字母 + -_.~ 不会被转义,其他字符都会被以百分号(%)后跟两位十六进制数 %{hex} 的方式进行转义

  • url 编码标准 RFC3986 是保留方括号的
  • 可能 axios 非最新版本也是一个原因,当前使用的"axios": "^1.7.2",据说最新版本是已经转换方括号了,没有试过…

三、解决方案

  • 一般 axios 自带 qs 模块,使用 qsparamsSerializer 方法序列化 params
  • 参考axios请求配置文档:https://www.axios-http.cn/docs/req_config
 // 解决数组url传参时参数带'[]'问题paramsSerializer: function (params) {return qs.stringify(params, { arrayFormat: "repeat" });},

在这里插入图片描述

  • 相关代码如下:

    1. 封装的axios文件request.js

      /**** Author: **** Date: 2024-09-04** Description: axios接口封装**/import axios from "axios";
      import { Message } from "element-ui";// create an axios instance  创建 axios 实例
      const service = axios.create({baseURL: process.env.VUE_APP_BASE_API, // url = base url + request urltimeout: 20000, // request timeoutheaders: {"Content-Type": "application/json;charset=UTF-8","x-requested-with": "XMLHttpRequest",},
      });let globalVarMsg = null; // 全局变量Msg,用于控制Message只弹出一次/*** request interceptor 请求拦截*/
      service.interceptors.request.use((config) => {return config;},(error) => {// do something with request errorreturn Promise.reject(error);}
      );
      /*** response interceptor 响应拦截*/
      service.interceptors.response.use((response) => {const status = response.status;const res = response.data;// if the custom code is not 20000, it is judged as an error.if (!res.success && response.config.headers.popUps !== false) {if (!globalVarMsg) {globalVarMsg = true;Message({message:status != 200 ? "系统开小差,请稍后再试" : res.msg || "未知错误",type: "error",duration: 5 * 1000,onClose: () => {globalVarMsg = null;},});}}return res;},(error) => {const msg = error.response?.data?.message || "";if (!globalVarMsg) {globalVarMsg = true;Message({message: msg || error.message || "系统开小差,请稍后再试",type: "error",duration: 5 * 1000,onClose: () => {globalVarMsg = null;},});}return Promise.reject(error);}
      );export default service;
    2. 接口文件 manage.js

      /***   接口-管理*/
      import request from "@/utils/request";       // 上面封装的request.js文件
      const qs = require("qs");                    // 一般 axios 自带 qs 模块const api = {delEvents: "/rest/event/batch/delete",
      };/*** 批量删除事件*/
      export function delEvents(params) {return request({url: api.delEvents,method: "delete",params: params,// 解决数组url传参时参数带'[]'问题paramsSerializer: function (params) {return qs.stringify(params, { arrayFormat: "repeat" });},});
      }
      

四、qs 的常用 arrayFormat 参数

qs地址:https://github.com/ljharb/qs

qs镜像中文地址:https://gitcode.com/gh_mirrors/qs/qs/overview?utm_source=csdn_github_accelerator&isLogin=1

qs.stringify({ a: ['b', 'c', 'd'] });  // 数组字符串化遵循 arrayFormat 选项,默认为 indices:
// 结果为 'a[0]=b&a[1]=c&a[2]=d'
qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });// 结果为 'a=b&a=c&a=d'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })// 结果为 'a[0]=b&a[1]=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })// 结果为 'a[]=b&a[]=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })// 结果为 'a=b&a=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })// 结果为 'a=b,c'

这篇关于解决:axios 请求头url传参数组时发生400错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137765

相关文章

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Mysql DATETIME 毫秒坑的解决

《MysqlDATETIME毫秒坑的解决》本文主要介绍了MysqlDATETIME毫秒坑的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 今天写代码突发一个诡异的 bug,代码逻辑大概如下。1. 新增退款单记录boolean save = s

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用