欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

axios 的详细内容和完整的软件包方法

最编程 2024-03-04 22:00:57
...


一小池勺❤️❤️❤️ ❤️❤️❤️❤️胸有惊雷而面如平湖者,可拜上将军也。


axios详解以及完整封装方法

一、axios是什么

Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。

axios有以下特性:

从浏览器创建 XMLHttpRequests

从 node.js 创建 http 请求

支持 Promise API

拦截请求和响应

转换请求和响应数据

取消请求

自动转换JSON数据

客户端支持防御XSRF

axios可以请求的方法:

get:获取数据,请求指定的信息,返回实体对象

post:向指定资源提交数据(例如表单提交或文件上传)

put:更新数据,从客户端向服务器传送的数据取代指定的文档的内容

patch:更新数据,是对put方法的补充,用来对已知资源进行局部更新

delete:请求服务器删除指定的数据

head:获取报文首部

请求方法别名

为了方便起见,axios为所有支持的请求方法提供了别名:

axios(config)

axios.request(config)

axios.get(url [,config])

axios.post(url [,data [,config]])

axios.put(url [,data [,config]])

axios.delete(url [,config])

axios.patch(url [,data [,config]])

axios.head(url [,config])

二.axios实例及配置方法

1.创建axios实例

axios.create([config])

可以同时创建多个axios实例。

示例代码

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])

2.配置方法

配置对象常用的配置项:

这些是创建请求时可以用的配置选项。只有 url 是必需的。如果没有指定 method,请求将默认使用 GET 方法。更多配置项请查看官方文档

{
  // 路径url
  url: '/user',
 
  // 请求方法,默认get
  method: 'get', 
 
  //基础url,最终请求的url是 baseURL+url拼接,所以再全局设置默认,可以使得发送请求时的url变得简洁
  baseURL: 'https://some-domain.com/api/',
 
  //设置请求头
  headers: {'X-Requested-With': 'XMLHttpRequest'},
 
  //设置请求url的query参数,可以使得url简洁。
  //比如url是https://some-domain.com/api/user  然后params如下设置,那么最终的url是:
  //https://some-domain.com/api/user?ID=12345&name=Jack
  params: {
  ID: 12345,
  name:"Jack"
  },
 
 //设置请求体
  data: {
  firstName: 'Fred'
  },
 
  //设置请求的另外一种格式,不过这个是直接设置字符串的
  data: 'Country=Brasil&City=Belo Horizonte',
 
 //请求超时,单位毫秒,默认0,不超时。
  timeout: 1000,
 
  //响应数据类型,默认json
  responseType: 'json', 
 
  //响应数据的编码规则,默认utf-8
  responseEncoding: 'utf8',
 
  //响应体的最大长度 
  maxContentLength: 2000,
 
  // 请求体的最大长度
  maxBodyLength: 2000,
 
  //设置响应状态码为多少时是成功,调用resolve,否则调用reject失败
  //默认是大于等于200,小于300
  validateStatus: function (status) {
  return status >= 200 && status < 300; 
  },

默认配置

可以设置全局默认配置,是为了避免多种重复配置在不同请求中重复,比如baseURL、timeout等,这里设置baseURL。

全局 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.defaults.headers.common['Authorization'] = AUTH_TOKEN;

配置的优先级

配置将会按优先级进行合并。它的顺序是:在 lib/defaults.js 中找到的库默认值,然后是实例的 defaults 属性,最后是请求的 config 参数。后面的优先级要高于前面的。

三、拦截器

在请求或响应被 then 或 catch 处理前拦截它们,自定义的axios实例也可添加拦截器,如:

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

请求拦截器

示例代码

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

四、取消请求

注意:从 v0.22.0 开始,Axios 支持以 fetch API 方式—— AbortController 取消请求,CancelToken API被弃用

这里我们两种方法都介绍一下,使用过程中能用 AbortController 就尽量别用 CancelToken

AbortController

const controller = new AbortController();
 
axios.get('/foo/bar', {
   signal: controller.signal
}).then(function(response) {
   //...
});
// 取消请求
controller.abort()

CancelToken

let source = axios.CancelToken.source();
 
axios.get('/users/12345',{
        cancelToken: source.token
      }).then(res=>{
        console.log(res)
      }).catch(err=>{
        //取消请求后会执行该方法
        console.log(err)
      })
 
//取消请求,参数可选,该参数信息会发送到请求的catch中
source.cancel('取消后的信息');

也可以通过传递一个 executor 函数到 CancelToken 的构造函数来创建一个 cancel token

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

注意: 可以使用同一个 cancel token 或 signal 取消多个请求

五、axios封装

先设计我们想要这个通用请求能达到什么样的效果:

优化配置,设置默认配置项(responseType、跨域携带cookie、token、超时设置)

统一设置请求头

根据环境设置 baseURL

通过 Axios 方法直接发起请求

添加请求拦截器

添加响应拦截器

导出 Promise 对象

封装 Post 方法,精简 post 请求方式

封装 Get 方法,精简 get 请求方式

请求成功,配置业务状态码

全局的loading配置

VUE中axios的封装

在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中。他有很多优秀的特性,例如拦截请求和响应、取消请求、转换json、客户端防御XSRF等。所以我们的尤大大也是果断放弃了对其官方库vue-resource的维护,直接推荐我们使用axios库。如果还对axios不了解的,可以移步axios文档。

安装 npm install axios //=> 安装axios

引入

一般我会在项目的src目录中,新建一个request文件夹,然后在里面新建一个http.js和一个api.js文件。http.js文件用来封装我们的axios,api.js用来统一管理我们的接口。

// 在http.js中引入axios
import axios from 'axios'; // 引入axios
import QS from 'qs'; // 引入qs模块,用来序列化post类型的数据,后面会提到
// vant的toast提示框组件,大家可根据自己的ui组件更改。
import { Toast } from 'vant';

环境的切换

我们的项目环境可能有开发环境、测试环境和生产环境。我们通过node的环境变量来匹配我们的默认的接口url前缀。axios.defaults.baseURL可以设置axios的默认请求地址就不多说了。

// => 环境的切换
if (process.env.NODE_ENV == 'development') {    
  axios.defaults.baseURL = 'https://www.baidu.com';} 
else if (process.env.NODE_ENV == 'debug') {    
  axios.defaults.baseURL = 'https://www.ceshi.com';
} 
else if (process.env.NODE_ENV == 'production') {    
  axios.defaults.baseURL = 'https://www.production.com';
}

设置请求超时

通过axios.defaults.timeout设置默认的请求超时时间。例如超过了10s,就会告知用户当前请求超时,请刷新等。

axios.defaults.timeout = 10000;

post请求头的设置

post请求的时候,我们需要加上一个请求头,所以可以在这里进行一个默认的设置,即设置post的请求头为application/x-www-form-urlencoded;charset=UTF-8

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

请求拦截

我们在发送请求前可以进行一个请求的拦截,为什么要拦截呢,我们拦截请求是用来做什么的呢?比如,有些请求是需要用户登录之后才能访问的,或者post请求的时候,我们需要序列化我们提交的数据。这时候,我们可以在请求被发送之前进行一个拦截,从而进行我们想要的操作。

请求拦截
// 先导入vuex,因为我们要使用到里面的状态对象
// vuex的路径根据自己的路径去写
import store from '@/store/index';
 
// 请求拦截器axios.interceptors.request.use(    
  config => {        
    // 每次发送请求之前判断vuex中是否存在token        
    // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
    // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断 
    const token = store.state.token;        
    token && (config.headers.Authorization = token);        
    return config;    
  },    
  error => {        
    return Promise.error(error);    
})

这里说一下token,一般是在登录完成之后,将用户的token通过localStorage或者cookie存在本地,然后用户每次在进入页面的时候(即在main.js中),会首先从本地存储中读取token,如果token存在说明用户已经登陆过,则更新vuex中的token状态。然后,在每次请求接口的时候,都会在请求的header中携带token,后台人员就可以根据你携带的token来判断你的登录是否过期,如果没有携带,则说明没有登录过。这时候或许有些小伙伴会有疑问了,就是每个请求都携带token,那么要是一个页面不需要用户登录就可以访问的怎么办呢?其实,你前端的请求可以携带token,但是后台可以选择不接收啊!

响应的拦截

上一篇: Java 泛型 Class,Class<? >Class, Class<? extends T>,Class<? super T> 摘录

下一篇: sell、sale 和 sold,这三者的区别你知道吗?