Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 492|回复: 0

vue axios传参报错的解决方法

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-14 07:52:55 | 显示全部楼层 |阅读模式

    今天有人问同一套后台系统为什么jquery可以正常使用,axios却报错呢,下面总结如下:

     

      总的来说是jquery和axios传参类型不同,那为什么jquery和axios请求时传参类型不同? 

     

      1)jquery默认 form Data(如:url?a=1形式);

      因为jquery在执行post请求时,会默认设置Content-Type为application/x-www-form-urlencoded,发送的参数为form Data形式,所以服务器能够正确解析;

      2)而使用原生ajax、axios请求时,如果不显示的设置Content-Type,axios默认发送数据时,数据格式是application/json,控制台参数里显示Request Payload(即 json格式),而并非我们常用的Form Data格式。

     

      既然我们知道axios post方法默认使用application/json格式编码数据,那么解决方案就有两种:

      一是后台改变接收参数的方法;

      另一种则是将axios post方法的编码格式修改为application/x-www-form-urlencoded,这样就不需要后台做什么修改了。
    --------------------- 

    改变接收参数的解决办法:

      1)URLSearchParams

    var params = new URLSearchParams(); params.append('key1', 'value1'); //你要传给后台的参数值 key/value params.append('key2', 'value2'); params.append('key3', 'value3');
      bug: ie浏览器完全不兼容。
     
      2)qs  qs.stringfy(para)即可;
       但是JSON.stringify和qs.stringify虽然都是序列化,效果却不同,如下:
       1)JSON.stringify:    "{"a":"1","b":2}"
       2)qs.stringify:     a=1&b=2
        另,网上教程很多重新安装了 npm install qs --save, 需要注意的是axios里已经包含qs,不用重新安装;
     
      3)In node.js, you can use the  querystring module as follows:
      4)
     
     
    改变header头的解决办法: headers和transformRequest配合使用;
    const axiosInstance = axios.create({
       // axios实例配置
       timeout: 15000,
       method:  'post' ,
       headers: {
         'Content-Type' 'application/x-www-form-urlencoded'
       },
       transformRequest: [ function (data) {
         // 请求前参数序列化
         return  qs.stringify(data);
       }]
    });
     
     
    另附:axios参数里的params和data区别:
    在使用axios时,要注意到配置选项中包含params和data两者,以为他们是相同的,实则不然。 
    params用于get请求,是添加到url的请求字符串中的,即是发送请求的查询参数对象,对象中的数据会被拼接成 url?param1=value1&param2=value2。。
    而data是添加到请求体(body)中的, 用于post请求。
     
     

    参考:

    https://github.com/axios/axios/blob/master/README.md#using-applicationx-www-form-urlencoded-format

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-23 15:00 , Processed in 0.092327 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表