Axios的使用
Axios是一个基于Promise(ES6中用于处理异步的)的HTTP库,用于浏览器和node.js中。主要学习的就是如何封装使用和拦截器的使用
官网:http://www.axios-js.com/docs/
万能接口 http://jsonplaceholder.typicode.com/users
特点:
- 浏览器中创建XMLHttpRequests
- 从node.js中创建http请求
- 支持Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换JSON数据
- 客户端支持防御XSRF
一、安装方式:
①npm 方式安装:npm i axios --save
②script方式引入:
③yarn 方式安装:yarn add axios --save
二、配置方式
可以选择封装成文件的方式进行axios的封装,如果项目比较小,也可以选择在main.js中直接封装
我以main.js文件的封装为例
import axios from 'axios' //axios的配置 const instance = axios.create({ baseURL: 'https://some-domain.com/api/',//每个接口都会访问的一截路径 timeout: 1000,//响应超时时间 headers: {'X-Requested-With': 'XMLHttpRequest'},//设置头部信息,一般遇到跨域的时候,需要后台设置,不需要前端配置 // `transformRequest` 允许在向服务器发送前,修改请求数据 // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法 // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream transformRequest: [function (data) { // 对 data 进行任意转换处理 return data; }], // `transformResponse` 在传递给 then/catch 前,允许修改响应数据 transformResponse: [function (data) { // 对 data 进行任意转换处理 return data; }], // `params` 是即将与请求一起发送的 URL 参数 // 必须是一个无格式对象(plain object)或 URLSearchParams 对象 //如果每隔接口都需要传一个相同的参数,可以写在这个里面 params: { ID: 12345 }, }); Vue.prototype.$http = axios
没有的可以不设置
Axios拦截器(难理解一些,写过一次就会了)
重点是axios中拦截器的用法,就是在每次发送或者响应请求时都会拦截一下,一般会用在前端处理用户登陆失效时的检验(一些情况下,后台会选择处理,如果后台处理的话,前端就需要根据后台返回的状态码控制路由跳转至登陆页面就好)
代码如下
// 添加请求拦截器 axios.interceptors.request.use(function (config) { // 在发送请求之前做些什么 //在这里写需要处理的逻辑 return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); }); // 添加响应拦截器 axios.interceptors.response.use(function (response) { // 对响应数据做点什么 //在这里写需要处理的逻辑 return response; }, function (error) { // 对响应错误做点什么 return Promise.reject(error); });
这是需要在main.js或者自己额外拿出来的js中设置的代码
在真正vue组件中发送接收Ajax请求如果操作呢?
简易代码:(仅供参考)
this.$http.get('http://jsonplaceholder.typicode.com/users').then((response)=>{ //输出值 console.log(response,'接口返回的值') }).catch((err)=>{ console.log(err,'接口出错了') }) //如果是不规定方法的写法 this.$http({ url:'url', method:'post/put/patch/delete' }).then((response)=>{ console.log(response) }).catch((err)=>{ console.log(err) })
在实际的项目中,一般都会将所有的接口进行封装一遍,然后直接在不同的Vue组件中引入不同的接口方法
接口封装的方式
import request from '@/utils/request' //request是我在request文件中设置的axios的封装,也就是我文章上部分提到的在main.js中封装的代码 //get方式 ① export function getData(query){ return request({ url:'/api/user/getname', method:'get', params:query }) } ② //使用解构的方式传值,{ip}相当于?ip=ip export function getData(ip){ return request({ url:'/api/user/getname', method:'get', params:{ip} }) } ③//其他方式 export function getData(data){ return request({ url:'/api/user/getname', method:'post', data //建议使用data,我之前使用params报错因为data是你传给接口的整个的数据值 }) }