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

打印 上一主题 下一主题

主题 1865|帖子 1865|积分 5605

一、媒介



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

二、缘故原由

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

  • url 编码标准 RFC3986 是保存方括号的
  • 可能 axios 非最新版本也是一个缘故原由,当前使用的"axios": "^1.7.2",听说最新版本是已经转换方括号了,没有试过…
三、解决方案



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



  • 相关代码如下:

    • 封装的axios文件request.js
      1. /**
      2. *
      3. * Author: ***
      4. * Date: 2024-09-04
      5. *
      6. * Description: axios接口封装
      7. *
      8. */
      9. import axios from "axios";
      10. import { Message } from "element-ui";
      11. // create an axios instance  创建 axios 实例
      12. const service = axios.create({
      13.   baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
      14.   timeout: 20000, // request timeout
      15.   headers: {
      16.     "Content-Type": "application/json;charset=UTF-8",
      17.     "x-requested-with": "XMLHttpRequest",
      18.   },
      19. });
      20. let globalVarMsg = null; // 全局变量Msg,用于控制Message只弹出一次
      21. /**
      22. * request interceptor 请求拦截
      23. */
      24. service.interceptors.request.use(
      25.   (config) => {
      26.     return config;
      27.   },
      28.   (error) => {
      29.     // do something with request error
      30.     return Promise.reject(error);
      31.   }
      32. );
      33. /**
      34. * response interceptor 响应拦截
      35. */
      36. service.interceptors.response.use(
      37.   (response) => {
      38.     const status = response.status;
      39.     const res = response.data;
      40.     // if the custom code is not 20000, it is judged as an error.
      41.     if (!res.success && response.config.headers.popUps !== false) {
      42.       if (!globalVarMsg) {
      43.         globalVarMsg = true;
      44.         Message({
      45.           message:
      46.             status != 200 ? "系统开小差,请稍后再试" : res.msg || "未知错误",
      47.           type: "error",
      48.           duration: 5 * 1000,
      49.           onClose: () => {
      50.             globalVarMsg = null;
      51.           },
      52.         });
      53.       }
      54.     }
      55.     return res;
      56.   },
      57.   (error) => {
      58.     const msg = error.response?.data?.message || "";
      59.     if (!globalVarMsg) {
      60.       globalVarMsg = true;
      61.       Message({
      62.         message: msg || error.message || "系统开小差,请稍后再试",
      63.         type: "error",
      64.         duration: 5 * 1000,
      65.         onClose: () => {
      66.           globalVarMsg = null;
      67.         },
      68.       });
      69.     }
      70.     return Promise.reject(error);
      71.   }
      72. );
      73. export default service;
      复制代码
    • 接口文件 manage.js
      1. /**
      2. *   接口-管理
      3. */
      4. import request from "@/utils/request";       // 上面封装的request.js文件
      5. const qs = require("qs");                    // 一般 axios 自带 qs 模块
      6. const api = {
      7.   delEvents: "/rest/event/batch/delete",
      8. };
      9. /**
      10. * 批量删除事件
      11. */
      12. export function delEvents(params) {
      13.   return request({
      14.     url: api.delEvents,
      15.     method: "delete",
      16.     params: params,
      17.     // 解决数组url传参时参数带'[]'问题
      18.     paramsSerializer: function (params) {
      19.       return qs.stringify(params, { arrayFormat: "repeat" });
      20.     },
      21.   });
      22. }
      复制代码

四、qs 的常用 arrayFormat 参数

   qs地址:https://github.com/ljharb/qs
  qs镜像中文地址:https://gitcode.com/gh_mirrors/qs/qs/overview?utm_source=csdn_github_accelerator&isLogin=1
  1. qs.stringify({ a: ['b', 'c', 'd'] });  
  2. // 数组字符串化遵循 arrayFormat 选项,默认为 indices:
  3. // 结果为 'a[0]=b&a[1]=c&a[2]=d'
复制代码
  1. qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });
  2. // 结果为 'a=b&a=c&a=d'
复制代码
  1. qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })
  2. // 结果为 'a[0]=b&a[1]=c'
复制代码
  1. qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })
  2. // 结果为 'a[]=b&a[]=c'
复制代码
  1. qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })
  2. // 结果为 'a=b&a=c'
复制代码
  1. qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })
  2. // 结果为 'a=b,c'
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表