• VUE使用axios请求后端数据


    引言

    最近学习vue尝试使用axios请求后端数据,发现了一大堆问题,后端接收不到请求的数据。查了资料之后,在这里总结记录一下。

    先说一下常用的几种请求方式和模板:

    Get方式

    GET 方法传递参数格式如下:

    <script type = "text/javascript">
      mounted () {
        axios.get('http://localhost:8022/user/login', {
        params: {
          ID: 12345	//参数ID
        }
      })
      .then(function (response) {	//请求成功
        console.log(response);
        alert(response.data.msg);
      })
      .catch(function (error) {		//请求失败
        console.log(error);
      });
      }
    })
    </script>
    

    Post方式

    POST 方法传递参数格式如下:

    <script type = "text/javascript">
      mounted () {
        axios.post('http://localhost:8022/user/login', {
        params: {
          ID: 12345	//参数ID
        }
      })
      .then(function (response) {	//请求成功
        console.log(response);
        alert(response.data.msg);
      })
      .catch(function (error) {		//请求失败
        console.log(error);
      });
      }
    })
    </script>
    

    axios API 方式

    <script type = "text/javascript">
      mounted () {
        //  可以将请求方式、URL、请求/响应格式、请求头等参数进行单独配置
    	axios({		//GET 请求远程图片
      		method:'get',
     		url:'http://bit.ly/2mTM3nY',
      		responseType:'stream'
    	})
      	.then(function(response) {
      		response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
    	});
      }
    })
    </script>
    

    axios响应结构

    axios请求的响应包含以下信息:

    {
      // `data` 由服务器提供的响应
      data: {},
    
      // `status`  HTTP 状态码
      status: 200,
    
      // `statusText` 来自服务器响应的 HTTP 状态信息
      statusText: "OK",
    
      // `headers` 服务器响应的头
      headers: {},
    
      // `config` 是为请求提供的配置信息
      config: {}
    }
    

    使用 then 时,会接收下面这样的响应:

    axios.get("/user/12345")
      .then(function(response) {
        console.log(response.data);
        console.log(response.status);
        console.log(response.statusText);
        console.log(response.headers);
        console.log(response.config);
      });
    

    axios配置默认值

    可以指定将被用在各个请求的配置默认值。

    全局的 axios 默认值:

    axios.defaults.baseURL = 'https://api.example.com';
    axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
    

    post请求出现的错误

    我们知道在做 post 请求的时候,我们的传参是 data: {...} 或者直接 {...} 的形式传递的。

    在使用时,axios会帮我们 转换请求数据和响应数据 以及 自动转换 JSON 数据

    而在使用post方式请求时,会出现后端接收不到数据的现象

    解决方案一

    【用 URLSearchParams 传递参数】

    let param = new URLSearchParams()
    param.append('username', 'admin')
    param.append('pwd', 'admin')
    axios({
    	method: 'post',
    	url: '/api/lockServer/search',
    	data: param
    })
    

    需要注意的是: URLSearchParams 不支持所有的浏览器,但是总体的支持情况还是 OK 的,所以优先推荐这种简单直接的解决方案


    解决方案二

    【使用qs库】

    npm install qs --save

    import Qs from 'qs'		//引入qs
    let data = {
    	"username": "admin",
    	"pwd": "admin"
    }
    
    axios({
    	headers: {
    		'deviceCode': 'A95ZEF1-47B5-AC90BF3'
    	},
    	method: 'post',
    	url: '/api/lockServer/search',
    	data: Qs.stringify(data)	//使用qs将参数转换为query参数
    })
    
    

    网上有很多方案说使用

    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

    但是我用的时候不需要,没请求成功的可以试试


    解决方案三

    可以通过修改 transformRequest 来达到我们的目的

    import Qs from 'qs'
    axios({
    	url: '/api/lockServer/search',
    	method: 'post',
    	transformRequest: [function (data) {
    	    // 对 data 进行任意转换处理
    	    return Qs.stringify(data)
        }],
    	headers: {
    		'deviceCode': 'A95ZEF1-47B5-AC90BF3'
    	},
    	data: {
    	    username: 'admin',
    		pwd: 'admin'
    	}
    })
    
    

    欢迎访问个人博客:http://www.itle.info/

  • 相关阅读:
    linux 中安装 maven
    linux中如何安装jdk
    MySQL中的语法怎么执行的
    接口自动化--使用正则管理数据
    数学
    Java 并发--- 线程间协作的两种方式:wait、notify、notifyAll和Condition
    Java 并发--- Callable、Future和FutureTask
    Java 并发--- 线程池
    Java 并发--- 阻塞队列
    Java 并发---ConcurrentHashMap
  • 原文地址:https://www.cnblogs.com/luler/p/13936650.html
Copyright © 2020-2023  润新知