get请求传对象数组参数

有个请求,里面的参数有对象数组的情况,原来是 post 请求,后面接口改成 get 请求,那用 axios 请求的参数自然也从 data 改为 params。

第一次修改后的请求情况是这样的:
整个路径
在这里插入图片描述
请求参数格式如下
在这里插入图片描述
之所以变成 数组[数组里的对象属性]:对象的值 这种格式,是因为之前有做请求拦截 get 请求数组的处理,代码如下:

if (config.method === 'get') {
    // 如果是get请求,且params是数组类型如arr=[1,2],则转换成arr=1&arr=2
    config.paramsSerializer = function(params) {
      return qs.stringify(params, { arrayFormat: 'repeat' })
    }
  }

但后端要求的数据格式却是这样的 数组[对象在数组中的下标].对象属性:对象的属性值
在这里插入图片描述
很明显差的有点远啊。
然后百度了下,看看能不能从 qs.stringify 方法中找到合适的处理方式。
arrayFormat 数组格式化的方式有如下几个:

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'

然后 repeat 的格式就是我一开始用的,很明显不对,于是就一个一个去试其它的了。
indices格式:
在这里插入图片描述
indices 的格式看似有点接近了,但接口要的是 .属性,而不是 [属性],所以这个处理也不行。

brackets格式:
在这里插入图片描述
brackets 的格式就完全把下标给去掉了嘛!也不行

comma格式:
在这里插入图片描述
comma 的格式就完全是把对象数组化,看不太明白是怎么个数据格式!当然也不行。
所以上诉的方法都不行,只有 indices 格式是看着差不多的。

在不断去查论坛,看到了新的 qs.stringify 用法,看留言貌似给做到我想要的数据格式,代码如下:

qs.stringify(data, { allowDots: true, encode: false })

结果请求的参数真的是完全符合后端要求的那种:
在这里插入图片描述
可接口还是报400,请求参数还是有问题。

然后截图了两者的请求路径上的参数进行比对:
我的:
在这里插入图片描述
后端要求的:
在这里插入图片描述
可以明显的看到,后端要求的数据中下标是没用中括号 [] 的。后来查了下,才知道需要做 URL编码处理,想了解具体的 URL编码 知识,可以看 阮一峰的关于编码处理 这个文章。
最后也只是在原来 qs.stringify 的处理上再多一个URL编码处理即可:

if (config.method === 'get') {
    // 如果是get请求,且params是数组类型如arr=[1,2],则转换成arr=1&arr=2
    config.paramsSerializer = function(params) {
      return encodeURI(qs.stringify(params, { allowDots: true, encode: false }))
    }
  }

最后请求的截图如下,成功变成200请求:
在这里插入图片描述
在这里插入图片描述

### 回答1: 在Vue中,可以使用axios库或者Vue-resource来发送get请求。无论使用哪种库,数组的方法是一样的。 1. 使用axios发送get请求: ``` import axios from 'axios'; axios.get('/api/data', { params: { arr: [1, 2, 3] //将数组作为参数递给params对象中的arr属性 } }).then(response => { console.log(response.data); }).catch(error => { console.log(error); }); ``` 2. 使用Vue-resource发送get请求: ``` import Vue from 'vue'; import VueResource from 'vue-resource'; Vue.use(VueResource); Vue.http.get('/api/data', { params: { arr: [1, 2, 3] //将数组作为参数递给params对象中的arr属性 } }).then(response => { console.log(response.body); }).catch(error => { console.log(error); }); ``` 上述代码中,将数组作为参数递给`params`对象中的`arr`属性,当发送get请求时,会自动将数组转换为`arr=1&arr=2&arr=3`的形式进行输。在服务器端接收到请求时,可以通过获取对应参数的值来获取递的数组。 ### 回答2: 在Vue中,我们可以使用axios库来进行网络请求。当我们需要数组作为GET请求参数时,可以通过拼接URL的方式将数组递给后端。 首先,我们需要将数组转换为字符串形式。可以使用join()方法将数组元素连接为一个字符串,同时在每个元素之间添加逗号分隔符。例如,如果数组为[1, 2, 3],可以通过arr.join(',')得到"1,2,3"。 接下来,使用axios库发送GET请求,可以通过在URL中添加参数的方式数组。例如,假设我们要递名为"numbers"的数组参数,可以通过以下方式构建URL: ```javascript axios.get('/api/data', { params: { numbers: arr.join(',') } }) .then(response => { console.log(response.data); }) .catch(error => { console.log(error); }); ``` 在上述代码中,我们通过params选项参数,并将数组转换为字符串形式后作为numbers参数的值。在后端接收到请求时,可以通过解析URL参数来得到递的数组。 总结起来,要在Vue中通过GET请求数组,我们需要将数组转换为字符串,并在URL中以参数的形式递给后端。 ### 回答3: 在Vue中进行get请求数组参数,可以使用以下两种方式: 1. 通过在URL中以查询字符串的形式数组参数。示例代码如下: ```javascript // 定义要递的数组参数 const arr = [1, 2, 3]; // 使用axios进行get请求 axios.get('/api/path', { params: { arr: arr.join(',') // 将数组转换为逗号分隔的字符串 } }) .then(response => { // 处理请求成功的逻辑 }) .catch(error => { // 处理请求失败的逻辑 }); ``` 2. 通过在URL中以RESTful风格数组参数。示例代码如下: ```javascript // 定义要递的数组参数 const arr = [1, 2, 3]; // 构建URL,并将数组参数拼接到路径部分中 const url = `/api/path/${arr.join('/')}`; // 使用axios进行get请求 axios.get(url) .then(response => { // 处理请求成功的逻辑 }) .catch(error => { // 处理请求失败的逻辑 }); ``` 以上两种方式都可以用于在Vue中进行get请求数组参数。在服务器端接收到请求时,可以通过获取URL中的参数值解析出对应的数组参数进行处理。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值