axios 学习文档

摘要:
Axios是一个基于承诺的HTTP库,可以在浏览器和node.js中使用。执行POST请求axis.POST.then。接住执行多个并发请求函数getUserAccount(){returnaxios.get;}函数getUserPermissions(){returnaxios.get;}全部承诺。然后axios API可以通过传递相关配置来请求axios。Axios(配置)//发送POST请求Axios//远程映像GET请求节点中的Axios。js然后;Axios//发送GET请求Axios;请求方法别名为方便起见,已为所有受支持的请求方法提供了别名。轴全部,轴。spread创建实例您可以使用自定义配置创建axios的新实例。axios.createconststance=轴。创造下面列出了实例方法的可用实例方法//您可以轻松设置axis实例的“baseURL”,以将相对url传递给实例的方法。

什么是 axios?

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
axios Github

特性

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

浏览器支持

axios 学习文档第1张

安装

npm 安装:

$ npm install axios

bower 安装:

$ bower install axios

yarn 安装:

$ yarn add axios

jsDelivr CDN:

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

unpkg CDN:

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

注意:CommonJS用法

CommonJS中导入,请使用require()方法:

const axios = require('axios').default;

执行GET请求

const axios = require('axios');

// get 请求传入参数
axios.get('/user?ID=12345')
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });

// 同上面的get请求,两种写法均可
axios.get('/user', {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  })
  .then(function () {
    // always executed
  });  

// 想使用async / await吗?将`async`关键字添加到您的外部函数/方法中。
async function getUser() {
  try {
    const response = await axios.get('/user?ID=12345');
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}

注意:这 async/await是ECMAScript 2017的一部分,并且Internet Explorer和较旧的浏览器不支持,因此请谨慎使用。

执行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');
}

Promise.all([getUserAccount(), getUserPermissions()])
  .then(function (results) {
    const acct = results[0];
    const perm = results[1];
  });

axios API

可以通过将相关配置传递到来发出请求axios。

axios(配置)

// 发送POST请求
axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});

// 在node.js的远程图像GET请求
axios({
  method: 'get',
  url: 'http://bit.ly/2mTM3nY',
  responseType: 'stream'
})
  .then(function (response) {
    response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
  });

axios(url[, config])

// 发送GET请求(默认方法)
axios('/user/12345');

请求方法别名

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

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

注意:使用别名方法urlmethod和时,data无需在config中指定属性。

并发(不推荐使用)

Promise.all用来代替以下功能。
帮助程序功能,用于处理并发请求。
axios.all(iterable)axios.spread(callback)

创建一个实例

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

axios.create([config])

const 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#options(url[, config])
  • axios#post(url[, data[, config]])
  • axios#put(url[, data[, config]])
  • axios#patch(url[, data[, config]])
  • axios#getUri([config])

请求配置

这些是发出请求的可用配置选项。仅url需要。如果method未指定,则请求默认为GET

{
  // `url`将用于请求的`url`
  url: '/user',

  // `method`是发出请求时要使用的请求方法
  method: 'get', // default

  // 除非“url”是绝对的,否则“baseURL”将加在“url”前面。
  // 可以方便地为axios实例设置“baseURL”以传递相对url 到该实例的方法。
  baseURL: 'https://some-domain.com/api/',

  // “transformRequest”允许在将请求数据发送到服务器之前对其进行更改
  // 这只适用于请求方法“PUT”、“POST”、“PATCH”和“DELETE”
  // 数组中的最后一个函数必须返回一个字符串或Buffer的实例ArrayBuffer,FormData或流
  // 您可以修改headers对象。
  transformRequest: [function (data, headers) {
    // 执行您想转换数据的任何操作

    return data;
  }],

  // “transformResponse”允许在之前对响应数据进行更改
  // 它被传给then/catch
  transformResponse: [function (data) {
    // 执行您想转换数据的任何操作

    return data;
  }],

  // `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”、“DELETE”和“PATCH”
  // 如果未设置“transformRequest”,则必须是以下类型之一:
  // - string,普通对象,ArrayBuffer,ArrayBufferView,URLSearchParams
  // - 浏览器选项:FormData、File、Blob
  // - Node选项: Stream, Buffer
  data: {
    firstName: 'Fred'
  },
  
  //将数据发送到正文的语法替代方法
  // method 是 post
  // 只发送值,不发送密钥
  data: 'Country=Brasil&City=Belo Horizonte',

  // “timeout”指定请求超时前的毫秒数。
  //如果请求所用时间超过“timeout”,则请求将被中止。
  timeout: 1000, // default is `0` (no timeout)

  // `withCredentials` 指示是否跨站点访问控制请求
  //应该使用凭据
  withCredentials: false, // default

  // “adapter”允许自定义处理请求,从而使测试更容易。
  // 返回一个promise并提供一个有效的响应(参见lib/adapters/自述文件.md).
  adapter: function (config) {
    /* ... */
  },

//“auth”指示应使用HTTP基本身份验证,并提供凭据。
//这将设置一个“Authorization”头,覆盖任何现有的
//使用“headers”设置的“Authorization”自定义标头。
//请注意,只有HTTP基本身份验证可以通过此参数进行配置。
//对于承载令牌等,请改用“Authorization”自定义头。
  auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },

  // `responseType` 表示服务器将使用的数据类型
  // /选项包括: 'arraybuffer', 'document', 'json', 'text', 'stream'
  //   browser 选项: 'blob'
  responseType: 'json', // default

  // `responseEncoding` 表示用于解码响应的编码(Node.js only)
  // 注意:“stream”或客户端请求的“responseType”被忽略
  responseEncoding: 'utf8', // default

  // `xsrfCookieName`是要用作xsrf令牌值的cookie的名称
  xsrfCookieName: 'XSRF-TOKEN', // default

  // `xsrfHeaderName`是携带xsrf令牌值的http头的名称
  xsrfHeaderName: 'X-XSRF-TOKEN', // default

  // `onUploadProgress` 允许处理上传的进度事件
  // 仅限于浏览器
  onUploadProgress: function (progressEvent) {
    // Do whatever you want with the native progress event
  },

  // `onDownloadProgress` 允许处理下载的进度事件
  //  仅限于浏览器
  onDownloadProgress: function (progressEvent) {
    // Do whatever you want with the native progress event
  },

  // `maxContentLength` 定义node.js中允许的http响应内容的最大大小(以字节为单位)
  maxContentLength: 2000,

  // `maxBodyLength`(仅限node选项)定义允许的http请求内容的最大大小(以字节为单位)
  maxBodyLength: 2000,

  // `validateStatus` 定义对给定的
  // HTTP响应状态代码。如果“validateStatus”返回“true”(或设置为“null` 或者'undefined`),承诺将被解决;否则,承诺将被 拒绝。
  validateStatus: function (status) {
    return status >= 200 && status < 300; // default
  },

  // `maxRedirects` 定义后续重定向的最大数量 node.js.
  // 如果设置为0,将不遵循重定向。
  maxRedirects: 5, // default

  // `socketPath` 定义要在中使用的UNIX套接字 node.js.
  // 例如,'/var/run/docker.sock公司'向docker后台程序发送请求。
  //只能指定“socketPath”或“proxy”。
  //如果两者都指定了,则使用“socketPath”。
  socketPath: null, // default

  // `httpAgent` and `httpsAgent` 定义执行http时要使用的自定义代理和https请求,分别在节点.js. 这允许添加如下选项
  // 默认情况下未启用的“keepAlive”
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),

  // `proxy` 定义代理服务器的主机名和端口。
//您也可以使用传统的“http_proxy”和
//`https_proxy`环境变量。如果使用的是环境变量
//对于代理配置,还可以定义一个“no_proxy”环境
//变量作为不应代理的域的逗号分隔列表。
//使用“false”禁用代理,忽略环境变量。
//“auth”指示应使用HTTP基本身份验证连接到代理,并且
//提供凭证。
//这将设置一个“Proxy Authorization”头,覆盖任何现有的
//使用“headers”设置的“Proxy Authorization”自定义标头。
  proxy: {
    host: '127.0.0.1',
    port: 9000,
    auth: {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },

  // `cancelToken` 指定可用于取消请求的取消令牌
  cancelToken: new CancelToken(function (cancel) {
  }),

  // `decompress`指示是否应解压缩响应正文
  // 自动地。如果设置为“true”,则还将删除“content encoding”标头
  // 从所有解压缩响应的responses对象
  // - Node 端:(XHR无法关闭解压缩)
  decompress: true // default

}

响应模式

请求的响应包含以下信息。

{
  // `data` 是服务器提供的响应
  data: {},

  // `status` 是来自服务器响应的HTTP状态代码
  status: 200,

  // `statusText` 是来自服务器响应的HTTP状态消息
  statusText: 'OK',

//`headers`服务器响应的HTTP头
//所有标题名称都是小写的,可以使用括号表示法进行访问。
//示例:`响应.headers['content-type']`
  headers: {},

  // `config` 是为请求提供给“axios”的配置
  config: {},

  // `request` 是生成此响应的请求
  //它是中的最后一个ClientRequest实例 node.js(重定向中)
  // 以及浏览器中的XMLHttpRequest实例
  request: {}
}

使用时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);
  });

使用catch或将reject回调作为的第二个参数传递时then,响应将通过error对象提。

配置默认值

您可以指定将应用于每个请求的配置默认值。

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

自定义实例默认值

// 创建实例
const instance = axios.create({
  baseURL: 'https://api.example.com'
});

// 创建实例后更改默认值instance
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

配置优先顺序

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

//使用库提供的配置默认值创建一个实例
//此时,超时配置值为'0',这是库
const 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) {
    // 在2xx范围内的任何状态代码都会触发此功能
    // 处理响应数据
    return response;
  }, function (error) {
    // 任何超出2xx范围的状态代码都会触发此功能
    // 处理响应错误
    return Promise.reject(error);
  });

如果以后需要删除拦截器,则可以。

const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

您可以将拦截器添加到axios的自定义实例中。

const 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 if (error.request) {
      // 已提出请求,但未收到任何答复
      // `error.request` 是浏览器中XMLHttpRequest的实例
      // http.ClientRequest 是 node.js 中
      console.log(error.request);
    } else {
      //设置请求时发生了触发错误的问题
      console.log('Error', error.message);
    }
    console.log(error.config);
  });

使用validateStatusconfig选项,您可以定义应该引发错误的HTTP代码。

axios.get('/user/12345', {
  validateStatus: function (status) {
    return status < 500; // 仅当状态代码小于500时才进行解析
  }
})

通过使用toJSON该对象,您可以获取有关HTTP错误的更多信息的对象。

axios.get('/user/12345')
  .catch(function (error) {
    console.log(error.toJSON());
  });

消除

您可以使用cancel取消请求。

axios cancel API基于撤回的可取消承诺提议。

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


const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function (thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// 取消请求
source.cancel('Operation canceled by the user.');

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

const CancelToken = axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // An executor function receives a cancel function as a parameter
    cancel = c;
  })
});

// cancel the request
cancel();
 

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

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

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

浏览器

在浏览器中,可以URLSearchParams按以下方式使用API:

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

请注意,URLSearchParams并非所有的浏览器(见支持caniuse.com),但有一个polyfill 可用(确保填充工具全球环境)。

另外,您可以使用该qs库对数据进行编码:

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

或以另一种方式(ES6),

import qs from 'qs';
const data = { 'bar': 123 };
const options = {
  method: 'POST',
  headers: { 'content-type': 'application/x-www-form-urlencoded' },
  data: qs.stringify(data),
  url,
};
axios(options);
 

Node.js

请求参数
在node.js中,可以使用qs库。

表格数据

在node.js中,可以form-data按以下方式使用该库:

const FormData = require('form-data');
 
const form = new FormData();
form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_file', fs.createReadStream('/foo/bar.jpg'));

axios.post('https://example.com', form, { headers: form.getHeaders() })

或者,使用拦截器:

axios.interceptors.request.use(config => {
  if (config.data instanceof FormData) {
    Object.assign(config.headers, config.data.getHeaders());
  }
  return config;
});

TypeScript

引入axios及使用

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

免责声明:文章转载自《axios 学习文档》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL学习笔记:字符串前后补全0四、使用ADB命令清除缓存下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

taro3.x: 回到顶部ScrollView实现方式

使用ScrollView,onScroll,scrollTop属性设置Math.random()(0-1)之间实现 import React, { useState } from 'react' import { View, Input, ScrollView, Text } from '@tarojs/components' import classn...

Web DNS 实战

环境部署   192.168.9.28     Centos7     zx28.zxjr.com     DNS 主     192.168.9.29   Centos7   zx29.zxjr.com   DNS 从   192.168.9.30     Centos7     zx30.zxjr.com   测试机   192.168...

httprunner(setup和teardown及hook)

httprunner有两种setup和teardown的定义方式,一个是测试类级别,一个是测试步骤级别的定义。 测试类级别的setup和teardown第一种写法setup和teardown: #!/user/bin/env python # -*- coding: utf-8 -*- """ ----------------------...

Vue数据更新但页面没有更新的多种情况

Vue数据更新但页面没有更新的多种情况 1、Vue 无法检测实例被创建时不存在于 data 中的 变量 原因:由于 Vue 会在初始化实例时对 data中的数据执行 getter/setter 转化,所以 变量必须在 data 对象上存在才能让 Vue 将它转换为响应式的。 例如: new Vue({ data:{}, template: '&l...

FFmpeg解码H264及swscale缩放详解

原文  http://blog.csdn.net/gubenpeiyuan/article/details/19548019 主题 FFmpeg 本文概要:         本文介绍著名开源音视频编解码库ffmpeg如何解码h264码流,比较详细阐述了其h264码流输入过程,解码原理,解码过程。同时,大部分应用环境下,以原始码流视频大小展示并不是...

Jedis支持哨兵模式下认证

Redis高可用哨兵模式,为了安全,也会添加认证 # 检查Redis哨兵模式下master节点命令 $ SENTINEL get-master-addr-by-name mymaster 所以,我们在Java中连接Redis时,就需要配置两种密码; 1. 连接哨兵的认证密码: sentinelPassword 2. 哨兵返回的master节点密码:red...