记录一下前端使用axios遇到的坑

记录一下前端使用axios遇到的坑

代码部分

在vue里面的查询所有的接口.

	var aa = {
        "page": {"pageSize": this.pageSize, "pageIndex": this.page},
        "customerId": cl,
        "queryCondition": this.deviceNames
      }
   this.$api.post7('/v2/pointInspection/getDeviceClassifyList', aa, r ={
        this.data1 = r.data.result
        this.count = r.data.page.total
        this.$Spin.hide()
 })

在index.js 统一声明,apiAxios3 , post7

function apiAxios3 (method, url, params, callback) {
  // debugger
  var token = ''
  if (params) {
    params = filterNull(params)
  }
  if (url.indexOf('login') !== -1 === true) {
    token = 'Basic bGRzLXVzZXItc2VydmljZToxMjM0NTY='
  } else {
    token = Util.getToken()
  }
  // console.log("Token="+token)
  var paramsStr = qs.stringify(params)
  axios({
    method: method,
    url: url,
    data: ['POST', 'PUT', 'DELETE'].indexOf(method) !== -1 ? params : null,
    params: method === 'GET' ? paramsStr : null,
    baseURL: rootMaint,
    withCredentials: false,
    headers: {
      'Content-Type': 'application/json;charset=UTF-8',
      'Authorization': token
    }
  })
    .then(function (res) {
      callback(res)
    })
    .catch(function (err) {
      if (err) {
        console.log('载入错误,' + err)
      }
    })
}
 post7: function (url, params, callback) {
    return apiAxios3('POST', url, params, callback)
  },

重现问题

  1. 重现使用apiAxios3出现的问题
var aa = {
        "page": {"pageSize": this.pageSize, "pageIndex": this.page},
        "customerId": cl,
        "queryCondition": this.deviceNames
      }
      //后端开发说是传值要给json字符串.所有前端需要把参数转为json
		//JSON.stringify(aa)
		//然后我打debugger看这个参数传过去为什么报错
      this.$api.post7('/v2/pointInspection/getDeviceClassifyList', JSON.stringify(aa), r => {
        this.data1 = r.data.result
        this.count = r.data.page.total
        this.$Spin.hide()
      })
  1. 刷新页面
控制台报错

载入错误,TypeError: Cannot assign to read only property '0' of string '{"page":{"pageSize":14,"pageIndex":1},"customerId":1,"queryCondition":""}'

继续看,这个报错在哪

最后找到在apiAxios3 里面报错了.打debugger看看为什么报错.

function apiAxios3 (method, url, params, callback) {
  // debugger
  var token = ''
  if (params) {
    params = filterNull(params)
  }
  if (url.indexOf('login') !== -1 === true) {
    token = 'Basic bGRzLXVzZXItc2VydmljZToxMjM0NTY='
  } else {
    token = Util.getToken()
  }
  // console.log("Token="+token)
  var paramsStr = qs.stringify(params)
  axios({
    method: method,
    url: url,
    data: ['POST', 'PUT', 'DELETE'].indexOf(method) !== -1 ? params : null,
    params: method === 'GET' ? paramsStr : null,
    baseURL: rootMaint,
    withCredentials: false,
    headers: {
      'Content-Type': 'application/json;charset=UTF-8',
      'Authorization': token
    }
  }).then(function (res) {
      callback(res)
    })
    .catch(function (err) {
      if (err) {
        console.log('载入错误,' + err)
      }
    })
}

然后发现是filterNull这个方法过不去
在这里插入图片描述

// 参数过滤函数
function filterNull (o) {
  for (var key in o) {
    if (o[key] === null) {
      delete o[key]
    }
    if (toType(o[key]) === 'string') {
      o[key] = o[key].trim()
    } else if (toType(o[key]) === 'object') {
      o[key] = filterNull(o[key])
    } else if (toType(o[key]) === 'array') {
      o[key] = filterNull(o[key])
    }
  }
  return o
}

查看了这个方法,没有看错啥毛病.只能是对传参修改了

JSON.stringify(aa)
把json转的aa对象,修改不进行任何转,直接传aa

然后发现filterNull 方法可以通过了,但是发现在qs.stringify(params)的时候,把传参转了格式.
在这里插入图片描述

思考

继续看为什么会这样.然后发现.post和git请求的参数,都会被转格式

然而目前需求是post是json格式,get可以是params格式.
想清楚以后,我们就接着改.
在这里插入图片描述
修改后,get请求转格式,post请求不转,但是传参的时候,格式要写成json格式的
在这里插入图片描述
刷新页面,后端数据终于过来了

在这里插入图片描述

总结

为什么会遇到这种问题:

1.因为声明了头部的格式

headers: {
      **'Content-Type': 'application/json;charset=UTF-8',**
      'Authorization': token
    }

2.对比为什么别的接口可以成功,然后看别的apiAxios3 里面的头部

headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Authorization': token
    }

3.qs转格式也没毛病,就是因为头部的声明不一样,导致的
在这里插入图片描述
这下终于明白了为什么.解决完以后,看到axios POST提交数据的三种请求方式写法,这篇文章才恍然大悟,所以还是要多多实践啊.

然后还有注意一点就是后端的一些注释也会有影响

参考

axios POST提交数据的三种请求方式写法: https://segmentfault.com/a/1190000015261229

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Axios是一个基于 Promise 的 HTTP 客户端,可以用于浏览器和 node.js 中。它提供了一种简单易用的方式来发送 HTTP 请求和处理响应。以下是Axios的基本使用方法: 1. 安装Axios 可以使用npm或yarn安装Axios: ``` npm install axios ``` 或者 ``` yarn add axios ``` 2. 发送GET请求 使用Axios发送GET请求的基本语法如下: ```javascript axios.get(url[, config]) .then(function (response) { // 处理响应数据 }) .catch(function (error) { // 处理错误 }); ``` 其中,url是请求的地址,config是请求配置信息(可选)。 例如,发送一个GET请求获取用户信息: ```javascript axios.get('/user', { params: { id: 12345 } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); ``` 在上面的示例中,params是一个包含请求参数的对象,发送的请求地址是`/user?id=12345`。 3. 发送POST请求 使用Axios发送POST请求的基本语法如下: ```javascript axios.post(url[, data[, config]]) .then(function (response) { // 处理响应数据 }) .catch(function (error) { // 处理错误 }); ``` 其中,url是请求的地址,data是要发送的数据(可选),config是请求配置信息(可选)。 例如,发送一个POST请求创建一个新用户: ```javascript axios.post('/user', { firstName: 'John', lastName: 'Doe', age: 25 }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); ``` 在上面的示例中,发送的请求地址是`/user`,要发送的数据是一个包含用户信息的对象。 除了GET和POST请求,Axios还支持PUT、DELETE、HEAD和OPTIONS等HTTP请求方法,使用方法与上面类似。详细的使用说明可以参考Axios官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值