1. 概述

1.1 简介

  axios是一个基于Promise(本机支持ES6 Promise实现) 的HTTP库,用于浏览器和 nodejs 的 HTTP 客户端。具有以下特征:

    • 从浏览器中创建 XMLHttpRequests

      • XMLHttpRequest对象用于在后台与服务器交换数据,可做到在不重新加载页面的情况下更新网页,在页面已加载后从服务器请求数据或接收数据,在后台向服务器发送数据。所有的浏览器都支持XMLHttpRequest对象。
    • 从 node.js 创建 http 请求
      • 如get/post等
    • 支持 Promise API
      • 如promise所支持的链式回调,.then(res => {}).catch(err =>{})
    • 拦截请求和响应
      • 在请求之前或响应之后进行的处理,如请求之前增加统一的token标识,响应之后对公用的错误进行处理等。
    • 转换请求数据和响应数据
    • 取消请求
    • 自动转换JSON数据
    • 客户端支持防御XSRF

1.2 引入使用

  npm install axios  进行安装,安装成功后 import axios from 'axios' 进行引入模块,再对axios对象进行设置。如

/**
* 创建axios对象
**/
let axiosInstance =axios.create({
baseURL: configHttp.domain,
withCredentials:true,
});

  备注:使用 Vue.prototype.$http = axios; 进行配置于vue项目中,在页面中可使用this.$http.get('xxxx').then().catch()。

1.3 常用请求配置

  1.3.1 url

  数据请求的服务器URL,此配置必须存在,否则无访问路径无法进行数据请求。

  1.3.2 method

  创建请求时使用的方法,默认get方式。有多种请求方式,如:request/get/delete/head/post/put/patch,常用get与post.

  1.3.3 baseURL

  设置一个统一的基础路径(如http://www.demo.com/api/),使axios的get或post中的url使用相对URL,更改访问域名或端口号时只更改对应的baseURL值即可。

  1.3.4 headers

  headers是即将被发送的自定义请求头,可设置请求的数据标识(token)或post请求的数据类型等。

  1.3.5 timeout

  请求超时时间,单位为毫秒,若超过超时时间则请求中断。0表示无超时时间。

  1.3.6 withCredentials

  跨域请求时是否需要使用凭证,默认为false

1.4 配置的默认与自定义实例

  优先级别为:自定义实例>全局默认值>自带默认值

  1.全局默认值

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';

  2.自定义实例

// 创建实例时设置配置的默认值
var instance = axios.create({
baseURL: 'https://api.example.com'
}); // 在实例已创建后修改默认值
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

  备注:也可在请求拦截中进行设置对应的配置。

1.5 拦截器

  在请求或响应被 then 或 catch 处理前拦截他们,分为请求拦截器和响应拦截器

    • 请求拦截器(interceptors.request)是指可以拦截每次或指定HTTP请求,并可修改配置项。
    • 响应拦截器()可以拦截每次HTTP请求对应的响应,并可修改返回结果项。

  示意图

  

  一般在请求拦截器中增加标识token或其他请求配置,在响应拦截器中对统一错误或状态码进行处理(跳转统一页面如登录)

// 添加请求拦截器
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);
});

2. 实例

2.1 axios配置

  备注:在headers.post['Content-Type']不为application/json时,传递post参数时需使用querystring中的querystring.stringify对参数进行格式化处理。

import axios from 'axios'
import configHttp from '../../configHttp' /**
* 创建axios对象
**/
let axiosInstance =axios.create({
baseURL: configHttp.domain,
withCredentials:true,
}); /**
* 访问请求拦截(在请求前处理)
**/
axiosInstance.interceptors.request.use(
function (config) {
config.headers.common['Platform'] = 'web';
return config;
},
function (error) {
return Promise.reject(error)
}
); /**
* 响应请求拦截(在响应前处理)
**/
axiosInstance.interceptors.response.use(
function (response) {
return response;
},
function (error) {
if(error.response){
let status=error.response.status;
switch (status) {
case 401:
// 跳转至login
break;
}
}
//处理报错 记录日志
if (error !== undefined) {
console.log(error);
} }
);
/**
* http请求响应处理函数
**/
let httpResponseHandle = function(){
let self = this;
let res = self.res;
if (res.code == '0') {
self.successCallback && self.successCallback(res);
} else if (res.code == 'C00004' || res.code =='C00002') {
// 清除token
// 跳转至login
} else {
// 统一错误弹出
self.failCallback && self.failCallback(res);
}
}; let http= {
/**
* 以get方式请求获取JSON数据
* @param {Object} opts 配置项,可以包含以下成员:
* @param {String} opts.url 请求地址
* @param {Object} opts.params 附加的请求参数
* @param {Function} opts.successCallback 成功的回调函数
* @param {Function} opts.failCallback 失败的回调函数
* **/
get: function (opts) {
axiosInstance
.get(opts.url, {params: opts.params})
.then(function (res) {
opts.res = res.data;
httpResponseHandle.call(opts);
})
.catch(function (err) {
if (err.response) {
if (err.response.data) {
opts.res = err.response.data;
httpResponseHandle.call(opts);
} else {
// 统一错误弹出
}
}
});
}, /**
* 以post方式请求获取JSON数据
* @param {Object} opts 配置项,可以包含以下成员:
* @param {String} opts.url 请求地址
* @param {Object} opts.params 附加的请求参数
* @param {Function} opts.successCallback 成功的回调函数
* @param {Function} opts.failCallback 失败的回调函数
* **/
post: function (opts) {
axiosInstance
.post(opts.url, opts.params)
.then(function (res) {
opts.res = res.data;
httpResponseHandle.call(opts);
})
.catch(function (err) {
if (err.response) {
if (err.response.data) {
opts.res = err.response.data;
httpResponseHandle.call(opts);
} else {
// 统一错误弹出
}
}
});
}
}; export default http;

2.2 实例调用

  在Vue中使用prototype进行设置,不能使用use设置。

  1.main.js中直接写入

import http from '@/common/js/http.js';
Vue.prototype.$http = http;

  2.其他引入

import Vue from 'vue'
import axios from '../common/js/http.js' Vue.prototype.$http = axios

2.3 页面使用

  vue单页面中的methods中使用

  1.get示例

  this.$http.get({
url: 'comm/getDataInfo',
params: {
param1: xxx,
param2: '3'
},
successCallback: res => {
// 数据处理
},
failCallback: res => {}
});

  2.post示例

   this.$http.post({
url: 'common/userLogin',
params: {
username: 'admin',
password: '123456'
},
successCallback: res => {
// 数据处理
},
failCallback: res => {}
});

2.4 http请求Content-Type: application/x-www-form-urlencoded

  接口使用x-www-form-urlencoded格式接收/传递数据时,需要使用qs(原来的querystring)对所传递的参数进行格式化处理;

  1.设置数据格式

headers: {
'Content-Type': 'application/x-www-form-urlencoded',
}

  2.在请求拦截处统一处理参数格式化

config.data = qs.stringify(config.data)
import axios from 'axios'
import qs from 'qs'
const http = axios.create({
timeout: 15000,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
/**
* 请求拦截器
*/
http.interceptors.request.use(config => {
const objParams = {
appKey: 'ccc',
bizContent: JSON.stringify(config.data),
}
config.data = qs.stringify(objParams) // objParams为传递参数
return config
}, error => {
Promise.reject(error)
})

VUE 数据请求和响应(axios)的更多相关文章

  1. vue数据请求显示loading图

    一般项目中,有时候会要求,你在数据请求的时候显示一张gif图片,然后数据加载完后,消失.这个,一般只需要在封装的axios中写入js事件即可.当然,我们首先需要在app.vue中,加入此图片.如下: ...

  2. vue数据请求

    我是vue菜鸟,第一次用vue做项目,写一些自己的理解,可能有些不正确,欢迎纠正. vue开发环境要配置本地代理服务.把config文件加下的index.js里的dev添加一些内容, dev: { e ...

  3. vue 数据请求

    作者QQ:1095737364    QQ群:123300273     欢迎加入!   要引入模块: vue-resource 1.在package.json中的dependencies中添加vue ...

  4. vue全局设置请求头 (封装axios请求)

    Vue.http.interceptors.push((request, next) => { // 请求发送前的处理逻辑 request.headers.set('Authorization' ...

  5. vue中 请求拦截 响应拦截设置

    第一,在项目的src中新建http.js文件,将以下代码复制进去 import axios from 'axios' import { Message, Loading } from 'element ...

  6. 02 Vue之vue对象属性功能&axios数据请求实现

    1.过滤器的声明和使用 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 定义过滤器的方式有两种. 1 使用Vue.filter()进行全局定义 2 在v ...

  7. vue 使用axios 数据请求第三方插件的使用

    axios 基于http客户端的promise,面向浏览器和nodejs 特色 浏览器端发起XMLHttpRequests请求 node端发起http请求 支持Promise API 监听请求和返回 ...

  8. 五、Vue:使用axios库进行get和post、用拦截器对请求和响应进行预处理、Mock(数据模拟)

    一.axios [应用]进行请求和传表单 [axios中文档]:https://www.kancloud.cn/yunye/axios/234845 [vue-axios]:https://cn.vu ...

  9. vue axios数据请求get、post方法的使用

    我们常用的有get方法以及post方法,下面简单的介绍一下这两种请求方法 vue中使用axios方法我们先安装axios这个方法 npm install --save axios 安装之后采用按需引入 ...

随机推荐

  1. NPOI导出Excel2007-xlsx

    今天在用npoi导出xls时会报错,经过在网上查找资料,找到一篇博客文章介绍的,原文地址https://www.cnblogs.com/spring_wang/p/3160020.html 1.今天再 ...

  2. SQL Server 调用 C# 方法实现正则表达式验证

    Ø  前言 1.   在 SQL Server 中默认是不支持正则表达式验证的,如果需要某个字符串匹配一个正则表达式的验证规则,就需要额外的编写 C# 方法,并发布到 SQL Server 数据库中. ...

  3. [C++]猜数字游戏的提示(Master-Mind Hints,UVa340)

    [本博文非博主原创,思路与题目均摘自 刘汝佳<算法竞赛与入门经典(第2版)>] Question 例题3-4 猜数字游戏的提示(Master-Mind Hints,UVa340) 实现一个 ...

  4. 从一个数组对象中取key 和value组成一个新的对象

    const type = [ {key:'TimeWeiDu',value:'时间维度'}, {key:'TranType',value:'交易类型'}, {key:'OrderType',value ...

  5. 迅为IMX6核心板兼容工业级、商业扩展级、Plus版本核心板

    IMX6核心板兼容单核.双核.四核.工业级.汽车级.iMX6Q最新Plus版本,可根据用户需求更换,百变定制,高端产品无忧! iMX6Q核心板(四核商业级) iMX6DL核心板(双核商业级) iMX6 ...

  6. MFCC/Filter Bank的提取流程

    预加重:通过一个一阶有限激励响应高通滤波器,使信号的频谱变得平坦,不易受到有限字长效应的影响. 分帧:根据语音的短时平稳特性,语音可以以帧为单位进行处理,实验中选取的语音帧长为32ms,帧移为16ms ...

  7. 利用PyMySQL库连接数据库

    安装与准备 这是python3的库,所以windows下安装不会像python2那样各种奇葩VC错误.是比较方便的傻瓜安装. Windows平台下: py -3 -m pip install PyMy ...

  8. 【Git】在GitHub或OSChina上新建项目后,如何在本地第一次push代码到服务器

    场景1:将本地代码push到远程仓库上的master主分支 #初始化git,执行init命令后,默认新建本地分支master git init #关联远程仓库 git remote add origi ...

  9. 0326 iframe和video experience

    今天的东西确实不少,很容易混淆,input下的属性太多,form下的属性也不少,内容多点,一时不能熟练掌握,晚上多拿出点时间练练 尤其是 form 和inpu那些属性格外别扭 下午的内嵌视频相对简单主 ...

  10. const的引用

    const的引用 对常量的引用:把引用绑定到const对象上,就像绑定到其他对象上一样,不能被用作修改它所绑定的对象: ; const int &r1 = ci;//正确:引用及其对应的对象都 ...