axios传递数组参数爬坑总结

最近做一个练手的vue项目,选择axios作为网络请求库。后台一个接口使用了数组作为参数,本以为没什么,实则遇到了一个大难题。

一开始,我是这么进行参数传递的:

axios.post(url,{
  ids: [1,2,3],
  type: 1
}).then((res) => {
})

好了,高高兴兴发起请求。接下来,你可能是这样子的:


一脸懵逼

如果你像正常的方式一样,将一个数组作为一个请求参数传递,要么axios直接抛出连接异常,要么后端接口接收不到匹配的参数。经过多番查询和实验,终于可以成功的传递各种数组类型的参数了,总结一下正确的传数组参数应该如下,需要引入一个序列化的库qs,瞅代码:

引用
import axios from 'axios'
import qs from 'qs'
get / delete请求方式解决方式如下
axios.get(url, {
    params: {
     ids: [1,2,3],
     type: 1
    },
    paramsSerializer: params => {
      return qs.stringify(params, { indices: false })
    }})

axios.delete(url, {
     params: {
     ids: [1,2,3],
     type: 1
    },
    paramsSerializer: params => {
      return qs.stringify(params, { indices: false })
    }})
post / put 请求方式解决方式如下
axios.post(url, qs.stringify(
    params: {
     ids: [1,2,3],
     type: 1
    }, { indices: false }))

 axios.put(url, qs.stringify(params: {
     ids: [1,2,3],
     type: 1
    }, { indices: false }))

其余类似。这样一来,使用网络请求传递参数的时候,数组参数就会转换为如下的形式

url?ids=1&ids=2&ids=3
后台接口接收

(1)后台以数组类型(int[])接收的结果

[1,2,3]

(1)后台以字符串形式(String)接收的结果

1,2,3

大功告成!

当然,这只是一种形式,大概还有4种形式,根据您的业务需求选择一种即可:

//形式1: ids=1&ids=2&id=3
qs.stringify({ids: [1, 2, 3]}, { indices: false })

 //形式2: ids[0]=1&aids1]=2&ids[2]=3
qs.stringify({ids: [1, 2, 3]}, {arrayFormat: ‘indices‘})

//形式3:ids[]=1&ids[]=2&ids[]=3
qs.stringify({ids: [1, 2, 3]}, {arrayFormat: ‘brackets‘})
 
//形式4: ids=1&ids=2&id=3
qs.stringify({ids: [1, 2, 3]}, {arrayFormat: ‘repeat‘}) 

最后,对axios进行了一个简单的封装,方便自己使用,这个封装只是一个参考,比较粗糙,哈哈,具体的可根据您的业务需求,做更加精细的封装:

import axios from 'axios'
import qs from 'qs'

let baseurl = 'http://localhost:8081/api'
function getRequest (apiPath, params, successCallback, errorCallback) {
  let url = baseurl + apiPath
 let req = axios.get(url, {
    params: params,
    paramsSerializer: params => {
      return qs.stringify(params, { indices: false })
    }})
  thenResponse(req, successCallback, errorCallback)
}
function postRequest (apiPath, params, successCallback, errorCallback) {
  let url = baseurl + apiPath
  let req = axios.post(url, qs.stringify(params, { indices: false }))
  thenResponse(req, successCallback, errorCallback)
}

function putRequest (apiPath, params, successCallback, errorCallback) {
  let url = baseurl + apiPath
  // var params = new URLSearchParams()
  // params.append('status', 0)
  let req = axios.put(url, qs.stringify(params, { indices: false }))
  thenResponse(req, successCallback, errorCallback)
}

function deleteRequest (apiPath, params, successCallback, errorCallback) {
  let url = baseurl + apiPath
  let req = axios.delete(url, {
    params: params,
    paramsSerializer: params => {
      return qs.stringify(params, { indices: false })
    }})
  thenResponse(req, successCallback, errorCallback)
}

/**
 * 请求结果处理
 * @param axiosRequest
 * @param successCallback
 * @param errorCallback
 */
function thenResponse (axiosRequest, successCallback, errorCallback) {
  axiosRequest.then((res) => {
    if (res.status === 200) {
      res = res.data
      if (res.code === 0) {
        if (successCallback) successCallback(res)
      } else {
        if (errorCallback) errorCallback(res.code, res.msg)
      }
    }
  }).catch((error) => {
    if (errorCallback) errorCallback(-1, error.message)
  })
}
export { getRequest, postRequest, putRequest, deleteRequest }

使用方式:

//导入封装axios的js文件
import {getRequest, deleteRequest} from 'utils/api'
//发送delete请求,带数组参数 与 普通参数
deleteRequest('/admin/user/del', {
        token: ‘SDFSDIFJSIODFKMSDOFM,SDOPFK’,
        ids: [1,2,3,4,5,6]
      }, function (res) {
        _this.$alert('删除成功')
      }, function (errcode, errmsg) {
        _this.$alert('code ' + errcode + ' ,meaasge ' + errmsg)
      })
//发送GET请求
getRequest('/admin/users', {
        status: 0,
        pageNum: this.currentPage,
        pageSize: count,
        token: '111'
      }, function (res) {
        _this.totalPage = res.data.total
      }, function (errcode, errmsg) {
        _this.$alert('code ' + errcode + ' ,meaasge ' + errmsg)
      })
daima
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,149评论 6 13
  • 参考Qt之QCryptographicHash QCryptographicHash类--提供了生成密码散列的方法...
    寒冰豌豆阅读 1,671评论 0 0
  • 我超级萌慵懒色气攻啊,我本人也试图往这方面发展呢(笑)
    奇_怪阅读 139评论 0 0
  • 2018年2月2日 星期五 晴 就在下午在公园遛开心(如果你看过我前面的日记,就知到开心是何方神圣)的时候,我突然...
    福叶子阅读 184评论 0 0