• axios 使用post方式传递参数,后端接收不到


    最近做vue项目,做图片上传的功能,使用get给后台发送数据,后台能收到,使用post给后台发送图片信息的时候,
    vue axios post请求发送图片base64编码给后台报错HTTP 错误 414
    请求一直报错,显示 request URI too large

    台显示一直没有收到数据 参数为null。网上查看了很多资料,才知道axios post传参的问题。

            this.axios.post( this.url_s+'/recipeController/findRecipe',{
                params:{
                     page: this.nums,
                     openId: localStorage.getItem("openId"), //this.$route.query.openId
                     hospitalId:localStorage.getItem("hospitalId")
                }
            }).then(res=>{
                Indicator.close()
                //this.$layer.close();
                if(res.data == 'no'){
                  this.nodata = true;
                }else{
                  this.lists = res.data;
                  this.updatamore = true;
                }
            }).catch(err=>{
                Toast('加载失败')
                Indicator.close()
            })
    

      用post存在这个问题

    一开始我是这么写的 ,post里面的数据放在params里面,这样是有问题的,在使用axios时,要注意到配置选项中包含params和data两者,以为他们是相同的,实则不然。 
    因为params是添加到url的请求字符串中的,用于get请求。
    而data是添加到请求体(body)中的, 用于post请求。

    然后我把params改为了data,后台还是接收不到,查阅了很多资料,需要把Content-Type为application/x-www-form-urlencoded,
    jquery在执行post请求时,会设置Content-Type为application/x-www-form-urlencoded,所以服务器能够正确解析,而使用原生ajax、axios请求时,如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。

    解决办法:

    一、URLSearchParams

    1、在main.js里 设置配置,修改Content-Type

    import axios from 'axios';
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
    Vue.prototype.$axios = axios;

    2、在组件vue里

     
    const url ='http://****你的接口****';
    var params = new URLSearchParams();
    params.append('key1', 'value1');       //你要传给后台的参数值 key/value
    params.append('key2', 'value2');
    params.append('key3', 'value3');
    this.$axios({
        method: 'post',
        url:url,
        data:params
    }).then((res)=>{
        
    });

    这样后台就收到数据了 请求成功;不过这个方法兼容性非常不好,ie浏览器完全不兼容。

    二、使用qs

    安装qs,在 main.js里引入

    import axios from 'axios';
    import qs from 'qs';
    Vue.prototype.$qs = qs;

    在vue组件里面请求方法

    let postData = this.$qs.stringify({
        key1:value1,
        key2:value2,
        key3:value3,
    });
    this.$axios({
        method: 'post',
        url:'url',
        data:postData
    }).then((res)=>{
        
    });

    这样就?了

    以上这个方式是网上查询的,实际我解决的是直接写一个params对象,将要传的参数添加到里面

         var params = new URLSearchParams();
            params.append('page', this.nums);       //你要传给后台的参数值 key/value
            params.append('openId', localStorage.getItem("openId"));
            params.append('hospitalId', localStorage.getItem("hospitalId"));
            console.log(params)
            this.axios.post(this.url_s+'/recipeController/findRecipe',params).then(res=>{
                Indicator.close()
                //this.$layer.close();
                if(res.data == 'no'){
                  this.nodata = true;
                }else{
                  this.lists = res.data;
                  this.updatamore = true;
                }
            }).catch(err=>{
                Toast('加载失败')
                Indicator.close()
            })
  • 相关阅读:
    SVN相关
    Sublime text 2/3 中 Package Control 的安装与使用方法
    JavaScript 限制input输入类型(多种方法实现)
    yahoo的30条优化规则
    浏览器页面加载解析渲染机制(一)
    Cookies 和 Session的区别
    Post Get 区别
    Vue 学习之 关键字、关键单词
    移动H5前端性能优化指南
    『Python基础练习题』day01
  • 原文地址:https://www.cnblogs.com/Tohold/p/9156947.html
Copyright © 2020-2023  润新知