『揭秘get请求』之发送数组格式的参数

1,825 阅读1分钟

问题

前后端端口联调过程中,有个接口需要通过get方法传递数组类型的参数,预期是这样的:

localhost:3000/api/test?names=['lily', 'lucy', 'mark']

实际却是这样的:

image.png

后端反馈不好处理,拿参数必须通过names[]的格式获取,而且只能拿到一个,预期的是通过names就可以拿到所有参数。

实际原因是服务器并没有正确读取数组类型的参数,必须通过字符串化的方法进行转化。

解决方案一

通过JSON.stringify的方式处理

解决方案二

axios提供了paramsSerializer序列化函数,可是使用qs提供的方法对参数序列化处理,用于将数组或对象处理成字符串格式,详细参见axios参数序列化

{
    // `paramsSerializer` 是一个负责 `params` 序列化的函数
    // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
    paramsSerializer: function(params) {
        return Qs.stringify(params, {arrayFormat: 'brackets'})
    },
}

qs默认的序列化方式为: qs.stringify(params, {arrayFormat: 'brackets'})

qs文档中对arrayFormat的配置有4种策略:

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'

根据项目要求,选择comma的方式处理数组,问题解决了。

axios.get('api/test', {
    params: {
        names: ['lily', 'lucy', 'mark']
    },
    paramsSerializer: p => qs.stringfy(p, {arrayFormat: 'comma'})
})

⭐️ 全局配置

如果多个get请求存在需要传递数组的情况,那么每一个接口都需要配置,比较麻烦。axios提供了全局配置的方式,通过axios.defaults即可配置:

import axios from 'axios';
import qs from 'query-string';

// axios 全局配置
axios.defaults.paramsSerializer = params => qs.stringify(params, {arrayFormat: 'comma'});

大功告成👏🏻👏🏻👏🏻

相关链接

Axios get with param array

qs parsing-arrays

Providing array as params