问题

当我们需要通过get方式传递一个包含数组的对象作为参数,例如:

const params = {
  sort: ['id,desc', 'name,asc'],
  type: 'term'
}

预期是解析为:https://www.cnblogs.com/api/test?sort=id%2Cdesc&sort=name%2Casc&type=term
然而真相是这样的:https://www.cnblogs.com/api/test?&sort[]=id,desc&sort[]=name,asc&type=term,后台是不可能解析到传递的参数。

解决方案

第1步:安装qs插件(如果安装过了引入就可以了)

// 在项目中使用命令行工具输入
npm install qs
// 引入qs插件
import qs from 'qs'

第2步:转码

用qs插件把参数转码

qs.stringify(params, { arrayFormat: 'repeat' })
// 输出结果: sort=id%2Cdesc&sort=name%2Casc&type=term

第3步:更换传值方式(很重要)

作为一个优秀的前端工程师,我们习惯用json形式的接口传值方式,例如:

export function getTest(params) {
  return request({
    url: 'api/test',
    method: 'get',
    params
  })
}
// https://www.cnblogs.com/api/test
// 这种是没有效果的

无奈,这种习惯方式这对于我们的需求是行不通的,所以尝试了这种方式:

export function getTest(params) {
  return request({
    url: 'api/test',
    method: 'get',
    params: qs.stringify(params, { arrayFormat: 'repeat' })
  })
}
// https://www.cnblogs.com/api/test?0=sort=id%2Cdesc&sort=name%2Casc&type=term
// 虽然看似达到预期了,但并没有达成一致,字符串拼接结果中间带了 “0=” 还是行不通

于是尝试原始方式,用url字符串拼接的形式

export function getTest(params) {
  return request({
    url: 'api/test?' + qs.stringify(params, { arrayFormat: 'repeat' }),
    method: 'get'
  })
}
// https://www.cnblogs.com/api/test?sort=id%2Cdesc&sort=name%2Casc&type=term
// 和我们的预期达成一致,这才是我们要的结果

效果图

解决方案第3步的第1段代码效果(未解决)

解决方案第3步的第1段代码

解决方案第3步的第2段代码效果(未解决)

解决方案第3步的第2段代码

解决方案第3步的第3段代码效果(已解决)

解决方案第3步的第3段代码

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'
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐