axios学习教程全攻略


Posted in Javascript onMarch 26, 2017

前言

随着 vuejs 作者尤雨溪发布消息,不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解。本来想在网上找找详细攻略,突然发现,axios 的官方文档本身就非常详细!!有这个还要什么自行车!!所以推荐大家学习这种库,最好详细阅读其官方文档。大概翻译了一下 axios 的官方文档,相信大家只要吃透本文再加以实践,axios 就是小意思啦!!

如果您觉得本文对您有帮助,不妨点个赞或关注收藏一下,您的鼓励对我非常重要。

axios 简介

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:

  • 从浏览器中创建 XMLHttpRequest
  • 从 node.js 发出 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防止 CSRF/XSRF

浏览器兼容性

axios学习教程全攻略

引入方式:

$ npm install axios
$ cnpm install axios //taobao源
$ bower install axios

或者使用cdn:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

举个栗子:

执行 GET 请求

// 向具有指定ID的用户发出请求
axios.get('/user?ID=12345')
 .then(function (response) {
 console.log(response);
 })
 .catch(function (error) {
 console.log(error);
 });
// 也可以通过 params 对象传递参数
axios.get('/user', {
 params: {
 ID: 12345
 }
 })
 .then(function (response) {
 console.log(response);
 })
 .catch(function (error) {
 console.log(error);
 });

执行 POST 请求

axios.post('/user', {
 firstName: 'Fred',
 lastName: 'Flintstone'
 })
 .then(function (response) {
 console.log(response);
 })
 .catch(function (error) {
 console.log(error);
 });

执行多个并发请求

function getUserAccount() {
 return axios.get('/user/12345');
}
function getUserPermissions() {
 return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
 .then(axios.spread(function (acct, perms) {
 //两个请求现已完成
 }));

axios API

可以通过将相关配置传递给 axios 来进行请求。

axios(config)

// 发送一个 POST 请求
axios({
 method: 'post',
 url: '/user/12345',
 data: {
 firstName: 'Fred',
 lastName: 'Flintstone'
 }
});
axios(url[, config])
// 发送一个 GET 请求 (GET请求是默认请求模式)
axios('/user/12345');

请求方法别名

为了方便起见,已经为所有支持的请求方法提供了别名。

  • axios.request(config)
  • axios.get(url [,config])
  • axios.delete(url [,config])
  • axios.head(url [,config])
  • axios.post(url [,data [,config]])
  • axios.put(url [,data [,config]])
  • axios.patch(url [,data [,config]])

注意

当使用别名方法时,不需要在config中指定url,method和data属性。

并发

帮助函数处理并发请求。

  • axios.all(iterable)
  • axios.spread(callback)

创建实例

您可以使用自定义配置创建axios的新实例。

axios.create([config])

var instance = axios.create({
 baseURL: 'https://some-domain.com/api/',
 timeout: 1000,
 headers: {'X-Custom-Header': 'foobar'}
});

实例方法

可用的实例方法如下所示。 指定的配置将与实例配置合并。

  • axios#request(config)
  • axios#get(url [,config])
  • axios#delete(url [,config])
  • axios#head(url [,config])
  • axios#post(url [,data [,config]])
  • axios#put(url [,data [,config]])
  • axios#patch(url [,data [,config]])

请求配置

这些是用于发出请求的可用配置选项。 只有url是必需的。 如果未指定方法,请求将默认为GET。

{
 // `url`是将用于请求的服务器URL
 url: '/user',
 // `method`是发出请求时使用的请求方法
 method: 'get', // 默认
 // `baseURL`将被添加到`url`前面,除非`url`是绝对的。
 // 可以方便地为 axios 的实例设置`baseURL`,以便将相对 URL 传递给该实例的方法。
 baseURL: 'https://some-domain.com/api/',
 // `transformRequest`允许在请求数据发送到服务器之前对其进行更改
 // 这只适用于请求方法'PUT','POST'和'PATCH'
 // 数组中的最后一个函数必须返回一个字符串,一个 ArrayBuffer或一个 Stream
 transformRequest: [function (data) {
 // 做任何你想要的数据转换
 return data;
 }],
 // `transformResponse`允许在 then / catch之前对响应数据进行更改
 transformResponse: [function (data) {
 // Do whatever you want to transform the data
 return data;
 }],
 // `headers`是要发送的自定义 headers
 headers: {'X-Requested-With': 'XMLHttpRequest'},
 // `params`是要与请求一起发送的URL参数
 // 必须是纯对象或URLSearchParams对象
 params: {
 ID: 12345
 },
 // `paramsSerializer`是一个可选的函数,负责序列化`params`
 // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
 paramsSerializer: function(params) {
 return Qs.stringify(params, {arrayFormat: 'brackets'})
 },
 // `data`是要作为请求主体发送的数据
 // 仅适用于请求方法“PUT”,“POST”和“PATCH”
 // 当没有设置`transformRequest`时,必须是以下类型之一:
 // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
 // - Browser only: FormData, File, Blob
 // - Node only: Stream
 data: {
 firstName: 'Fred'
 },
 // `timeout`指定请求超时之前的毫秒数。
 // 如果请求的时间超过'timeout',请求将被中止。
 timeout: 1000,
 // `withCredentials`指示是否跨站点访问控制请求
 // should be made using credentials
 withCredentials: false, // default
 // `adapter'允许自定义处理请求,这使得测试更容易。
 // 返回一个promise并提供一个有效的响应(参见[response docs](#response-api))
 adapter: function (config) {
 /* ... */
 },
 // `auth'表示应该使用 HTTP 基本认证,并提供凭据。
 // 这将设置一个`Authorization'头,覆盖任何现有的`Authorization'自定义头,使用`headers`设置。
 auth: {
 username: 'janedoe',
 password: 's00pers3cret'
 },
 // “responseType”表示服务器将响应的数据类型
 // 包括 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
 responseType: 'json', // default
 //`xsrfCookieName`是要用作 xsrf 令牌的值的cookie的名称
 xsrfCookieName: 'XSRF-TOKEN', // default
 // `xsrfHeaderName`是携带xsrf令牌值的http头的名称
 xsrfHeaderName: 'X-XSRF-TOKEN', // default
 // `onUploadProgress`允许处理上传的进度事件
 onUploadProgress: function (progressEvent) {
 // 使用本地 progress 事件做任何你想要做的
 },
 // `onDownloadProgress`允许处理下载的进度事件
 onDownloadProgress: function (progressEvent) {
 // Do whatever you want with the native progress event
 },
 // `maxContentLength`定义允许的http响应内容的最大大小
 maxContentLength: 2000,
 // `validateStatus`定义是否解析或拒绝给定的promise
 // HTTP响应状态码。如果`validateStatus`返回`true`(或被设置为`null` promise将被解析;否则,promise将被
 // 拒绝。
 validateStatus: function (status) {
 return status >= 200 && status < 300; // default
 },
 // `maxRedirects`定义在node.js中要遵循的重定向的最大数量。
 // 如果设置为0,则不会遵循重定向。
 maxRedirects: 5, // 默认
 // `httpAgent`和`httpsAgent`用于定义在node.js中分别执行http和https请求时使用的自定义代理。
 // 允许配置类似`keepAlive`的选项,
 // 默认情况下不启用。
 httpAgent: new http.Agent({ keepAlive: true }),
 httpsAgent: new https.Agent({ keepAlive: true }),
 // 'proxy'定义代理服务器的主机名和端口
 // `auth`表示HTTP Basic auth应该用于连接到代理,并提供credentials。
 // 这将设置一个`Proxy-Authorization` header,覆盖任何使用`headers`设置的现有的`Proxy-Authorization` 自定义 headers。
 proxy: {
 host: '127.0.0.1',
 port: 9000,
 auth: : {
 username: 'mikeymike',
 password: 'rapunz3l'
 }
 },
 // “cancelToken”指定可用于取消请求的取消令牌
 // (see Cancellation section below for details)
 cancelToken: new CancelToken(function (cancel) {
 })
}

使用 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.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

自定义实例默认值

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

配置优先级顺序

配置将与优先顺序合并。 顺序是lib / defaults.js中的库默认值,然后是实例的defaults属性,最后是请求的config参数。 后者将优先于前者。 这里有一个例子。

//使用库提供的配置默认值创建实例
//此时,超时配置值为`0`,这是库的默认值
var instance = axios.create();
 
//覆盖库的超时默认值
//现在所有请求将在超时前等待2.5秒
instance.defaults.timeout = 2500;
 
//覆盖此请求的超时,因为它知道需要很长时间
instance.get('/ longRequest',{
 timeout:5000
});

拦截器

你可以截取请求或响应在被 then 或者 catch 处理之前

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

如果你以后可能需要删除拦截器。

var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
你可以将拦截器添加到axios的自定义实例。

var instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});

处理错误

axios.get('/ user / 12345')
 .catch(function(error){
  if(error.response){
  //请求已发出,但服务器使用状态代码进行响应
  //落在2xx的范围之外
  console.log(error.response.data);
  console.log(error.response.status);
  console.log(error.response.headers);
  } else {
  //在设置触发错误的请求时发生了错误
  console.log('Error',error.message);
  }}
  console.log(error.config);
 });

您可以使用validateStatus配置选项定义自定义HTTP状态码错误范围。

axios.get('/ user / 12345',{
 validateStatus:function(status){
  return status < 500; //仅当状态代码大于或等于500时拒绝
 }}
})

消除

您可以使用取消令牌取消请求。

axios cancel token API基于可取消的promise提议,目前处于阶段1。

您可以使用CancelToken.source工厂创建一个取消令牌,如下所示:

var CancelToken = axios.CancelToken;
var source = CancelToken.source();
axios.get('/user/12345', {
 cancelToken: source.token
}).catch(function(thrown) {
 if (axios.isCancel(thrown)) {
 console.log('Request canceled', thrown.message);
 } else {
 // 处理错误
 }
});
//取消请求(消息参数是可选的)
source.cancel('操作被用户取消。');

您还可以通过将执行器函数传递给CancelToken构造函数来创建取消令牌:

var CancelToken = axios.CancelToken;
var cancel;
 
axios.get('/ user / 12345',{
 cancelToken:new CancelToken(function executor(c){
  //一个执行器函数接收一个取消函数作为参数
  cancel = c;
 })
});
 
// 取消请求
clear();

注意:您可以使用相同的取消令牌取消几个请求。

使用application / x-www-form-urlencoded格式

默认情况下,axios将JavaScript对象序列化为JSON。 要以应用程序/ x-www-form-urlencoded格式发送数据,您可以使用以下选项之一。

浏览器

在浏览器中,您可以使用URLSearchParams API,如下所示:

var params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params);

请注意,所有浏览器都不支持URLSearchParams,但是有一个polyfill可用(确保polyfill全局环境)。

或者,您可以使用qs库对数据进行编码:

var qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 });

Node.js

在node.js中,可以使用querystring模块,如下所示:

var querystring = require('querystring');
axios.post('http://something.com/', querystring.stringify({ foo: 'bar' });

你也可以使用qs库。

Promise

axios 依赖本机要支持ES6 Promise实现。 如果您的环境不支持ES6 Promises,您可以使用polyfill。

TypeScript

axios包括TypeScript定义。

import axios from 'axios';
axios.get('/user?ID=12345');

axios在很大程度上受到Angular提供的$http服务的启发。 最终,axios努力提供一个在Angular外使用的独立的$http-like服务。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript 函数使用说明
Apr 07 Javascript
js jq 单击和双击区分示例介绍
Nov 05 Javascript
Javascript毫秒数用法实例
Feb 05 Javascript
jQuery基于muipicker实现仿ios时间选择
Feb 22 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 Javascript
jQuery如何解决IE输入框不能输入的问题
Oct 08 Javascript
JS对象的深度克隆方法示例
Mar 16 Javascript
ES6新特性之字符串的扩展实例分析
Apr 01 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
Jan 02 Javascript
vue树形结构获取键值的方法示例
Jun 21 Javascript
jQuery.validate.js表单验证插件的使用代码详解
Oct 22 jQuery
详解单页面路由工程使用微信分享及二次分享解决方案
Feb 22 Javascript
js oncontextmenu事件使用详解
Mar 25 #Javascript
js 函数式编程学习笔记
Mar 25 #Javascript
CodeMirror js代码加亮使用总结
Mar 25 #Javascript
js 去掉字符串前后空格实现代码集合
Mar 25 #Javascript
在js中做数字字符串补0(js补零)
Mar 25 #Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
Mar 25 #Javascript
JS去掉字符串前后空格或去掉所有空格的用法
Mar 25 #Javascript
You might like
main.php
2006/12/09 PHP
介绍几个array库的新函数 php
2006/12/29 PHP
php下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
php循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
Zend的MVC机制使用分析(一)
2013/05/02 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
自动更新作用
2006/10/08 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
jquery解析xml字符串简单示例
2014/04/11 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
[00:16]热血竞技场
2019/03/06 DOTA
Python读写Excel文件的实例
2013/11/01 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
python3+pyqt5+itchat微信定时发送消息的方法
2019/02/20 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
精选干货:Java精选笔试题附答案
2014/01/18 面试题
机械设计制造专业个人求职信
2013/09/25 职场文书
高中生学习总结的自我评价范文
2013/10/13 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android