axios它是基于promise的http库,可运行在浏览器端和node.js中,然后作者尤雨溪也是果断放弃了对其官方库vue-resource的维护,直接推荐axios库,小编我也是从vue-resource转换过来的,差别说不来,我们讲一下axios在实际开发中的用法
axios特点
1.从浏览器中创建 XMLHttpRequests
2.从 node.js 创建 http 请求
3.支持 Promise API
4.拦截请求和响应 (就是有interceptor)
5.转换请求数据和响应数据
6.取消请求
7.自动转换 JSON 数据
8.客户端支持防御 XSRF
安装axios和qs
npm i axios --save npm i qs--save
创建项公共模块API
我是用vue-cli创建的项目在src->util->api.js(公共请求模块js)
引入axios和qs
import axios from 'axios'
有时候向后端发送数据,后端无法接收,考虑使用qs模块
import qs from 'qs'
判定开发模式
if (process.env.NODE_ENV == 'development') { axios.defaults.baseURL = '/api'; }else if (process.env.NODE_ENV == 'debug') { axios.defaults.baseURL = 'http://v.juhe.cn'; }else if (process.env.NODE_ENV == 'production') { axios.defaults.baseURL = 'http://v.juhe.cn'; }
全局设置头部信息
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
全局设置超时时间
axios.defaults.timeout = 10000;
请求路由拦截
在请求发出去之前,可以做一些判断,看是否是合法用户
axios.interceptors.request.use(function (config) { // 一般在这个位置判断token是否存在 return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); });
响应拦截
axios.interceptors.response.use(function (response){ // 处理响应数据 if (response.status === 200) { return Promise.resolve(response); } else { return Promise.reject(response); } }, function (error){ // 处理响应失败 return Promise.reject(error); });
封装请求方法
使用ES6模块化export导出import导入
在ES6前, 前端就使用RequireJS或者seaJS实现模块化, requireJS是基于AMD规范的模块化库, 而像seaJS是基于CMD规范的模块化库, 两者都是为了为了推广前端模块化的工具,现在ES6自带了模块化,不过现代浏览器对模块(module)支持程度不同, 需要使用babelJS, 或者Traceur把ES6代码转化为兼容ES5版本的js代码;
get请求
export function get(url, params){ return new Promise((resolve, reject) =>{ axios.get(url, { params: params }).then(res => { resolve(res.data); }).catch(err =>{ reject(err.data) }) }); }
post请求
export function post(url, params) { return new Promise((resolve, reject) => { axios.post(url, qs.stringify(params)) .then(res => { resolve(res.data); }) .catch(err =>{ reject(err.data) }) }); }
实际使用
在main.js中引入js
import {get,post} from './utils/api' //将方法挂载到Vue原型上 Vue.prototype.get = get; Vue.prototype.post = post;
配置请求环境
这里通过devServer请求代理
当在请求过程中有/api字符串会自动转换为目标服务器地址(target)
devServer: { historyApiFallback: true, hot: true, inline: true, stats: { colors: true }, proxy: { //匹配代理的url '/api': { // 目标服务器地址 target: 'http://v.juhe.cn', //路径重写 pathRewrite: {'^/api' : ''}, changeOrigin: true, secure: false, } }, disableHostCheck:true }
这是请求聚合数据的接口为列子
this.get('/toutiao/index"text-align: center">使用promise
1.比如用户想请求url1接口完后再调url2接口
var promise = new Promise((resolve,reject)=>{ let url1 = '/toutiao/index"htmlcode">var p = Promise.all([p1, p2, p3]);all()接受数组作为参数。p1,p2,p3都是Promise的实例对象,p要变成Resolved状态需要p1,p2,p3状态都是Resolved,如果p1,p2,p3至少有一个状态是Rejected,p就会变成Rejected状态
Promise.race()用法
var p = new Promise( [p1,p2,p3] )只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数,p的状态就会改变Resolved状态
Promise resolve()用法
Promise.resolve('foo') // 等价于 new Promise(resolve => resolve('foo'))有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用.
Promise reject()用法
Promise.reject('foo') // 等价于 new Promise(reject => reject('foo'))Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected。但是Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数。这一点与Promise.resolve方法不一致。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]