下载功能实现:get请求为数组

本文介绍了如何在前端使用QS库将数组参数按后端要求转换为特定格式,如`a=b&a=c`,并展示了QS库不同数组格式的转换方法。同时,讲解了如何通过后端设置响应头,使前端能够获取到下载文件的名称,并实现文件的自动下载。重点涉及HTTP请求头的配置和响应头的暴露。
前序

问题:
1、get请求中参数为数组:根据后端的要求转化为一定的格式
2、下载的文件名称在相应头中:需要后端更改后前端在请求头中获取

  1. 数组需转换

格式要求:数组 a=[“b”,“c”] 要求格式为a=b&a=c

//安装qs
npm inistall qs --save
//引入qs(我是在请求拦截配置中更改的)
important qs from 'qs'
/**
 * 请求拦截器(拦截get处理后可直接传递数组参数)
 */
instance.interceptors.request.use(
    config => {
        if (config.method === 'get') {
            config.paramsSerializer = function(params) {
            return qs.stringify(params, { arrayFormat: 'repeat' })
            }
        }
        return config;
    }
);
  • 知识拓展

qs转换数组如下:

1、qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })//// 输出结果:'a[0]=b&a[1]=c'
2、qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })// 输出结果:'a[]=b&a[]=c'
3、qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })// 输出结果:'a=b&a=c'
4、qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })// 输出结果:'a=b,c'
  1. 获取请求头中的参数

处理方法:需要后端处理请求头参数

//自定义响应头
ctx.res.setHeader('myheader','abc')
//通过header设置允许前端访问
ctx.res.setHeader('Access-Control-Expose-Headers', 'myheader')
                    getExportUserAction({
                        ...this.formValidate,//这是参数集合
                    }).then(res => {
                        if (!res.data) {
                            return
                        } else {
                            let url = window.URL.createObjectURL(res.data);
                            let link = document.createElement('a');
                            link.style.display = 'none';
                            link.href = url;
                            let fileName = res.headers["myheader"];//获取请求头
                            link.setAttribute('download', fileName);
                            document.body.appendChild(link);
                            link.click()
                            document.body.removeChild(link);
                            window.URL.revokeObjectURL(link.href);
                        }
                    })

参考

GET 请求中传递参数,通常使用 URL 的查询参数(Query String)形式。参数附加在 URL 的末尾,使用 `?` 开始,并通过 `&` 分隔多个参数。每个参数以 `key=value` 的形式表示。以下是几种常见的传递参数的方式: ### 1. 基本参数传递 对于简单的键值对参数,可以直接将其附加在 URL 上。例如: ``` http://example.com/api?param1=value1&param2=value2 ``` 这种方式适合传递字符串、数字等简单数据类型[^4]。 ### 2. 传递数组参数 GET 请求本身不支持直接传递数组,但可以通过以下方式实现数组参数的传递: #### 使用逗号分隔 将数组转换为以逗号分隔的字符串,然后在后端将其解析为数组。例如: ``` http://example.com/api?ids=1,2,3,4 ``` 后端接收到 `ids` 参数后,可以使用逗号分割将其转换为数组[^1]。 #### 使用重复的键 另一种方式是多次使用相同的键来传递多个值,例如: ``` http://example.com/api?ids=1&ids=2&ids=3 ``` 这种方式在后端解析时,可以将多个相同键的值合并为数组。但需要注意,不同后端框架对重复键的处理方式可能不同。 ### 3. 使用 `qs` 插件(适用于 Vue 等前端框架) 在 Vue 项目中,可以使用 `qs` 插件来序列化参数,自动处理数组和复杂对象的参数传递。例如: ```javascript import qs from 'qs'; const params = { ids: [1, 2, 3] }; const queryString = qs.stringify(params, { arrayFormat: 'comma' }); // 输出:ids=1%2C2%2C3 ``` 通过 `qs.stringify` 方法,可以将数组转换为逗号分隔的字符串,并自动进行 URL 编码。在请求时将生成的查询字符串附加到 URL 后即可[^2]。 ### 4. 使用 jQuery 的 `$.param` 方法 在 jQuery 中,可以使用 `$.param` 方法将对象序列化为查询字符串。例如: ```javascript var params = { param1: 'value1', param2: ['value2', 'value3'] }; var queryString = $.param(params); // 输出:param1=value1&param2%5B%5D=value2&param2%5B%5D=value3 ``` 此方法会自动处理数组,并将数组参数以 `param2[]` 的形式编码。在发送 GET 请求时,可以将生成的查询字符串附加到 URL 上[^5]。 ### 5. 使用 OpenFeign 传递对象或数组 在 OpenFeign 中,可以通过 `@SpringQueryMap` 注解传递对象或数组参数。例如: ```java @GetMapping("/api") ResponseEntity<String> getData(@SpringQueryMap MyRequestParams params); ``` `MyRequestParams` 类中可以定义多个字段,包括数组类型。OpenFeign 会自动将对象转换为查询参数形式。例如: ```java class MyRequestParams { private String name; private int[] ids; } ``` 发送请求时,OpenFeign 会自动将 `ids` 数组转换为多个查询参数,如 `ids=1&ids=2`[^3]。 ### 6. URL 编码 无论采用哪种方式,传递参数时都需要对参数值进行 URL 编码,以确保特殊字符(如空格、中文等)能被正确解析。例如,空格会被编码为 `%20`,逗号会被编码为 `%2C`。大多数框架和库(如 jQuery、qs 插件等)都会自动处理 URL 编码。 --- ### 示例代码 #### Vue 中使用 `qs` 传递数组参数 ```javascript import axios from 'axios'; import qs from 'qs'; const params = { ids: [1, 2, 3] }; const queryString = qs.stringify(params, { arrayFormat: 'comma' }); axios.get(`http://example.com/api?${queryString}`).then(response => { console.log(response.data); }); ``` #### jQuery 中使用 `$.param` 传递数组参数 ```javascript var params = { param1: 'value1', param2: ['value2', 'value3'] }; var queryString = $.param(params); $.get(`http://example.com/api?${queryString}`, function(response) { console.log(response); }); ``` #### OpenFeign 中传递数组参数 ```java @GetMapping("/api") ResponseEntity<String> getData(@SpringQueryMap MyRequestParams params); class MyRequestParams { private String name; private int[] ids; } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值