最近做项目中,我尝试对axios做封装,以简化操作逻辑。所以这篇主要整理一下在项目中封装axios。
axios本身有create方法,可以处理各种请求,有拦截器,有cancelToken,可以根据请求的不同做不同的处理。封装的目的,就是让请求独立,的拦截可以分类,同时需要使用cancelToken的请求可以很方便的使用,把axios封装到一个类中,把axios的功能集中起来,调用的时候只要创建一个实例就可以了。
因此,这里封装就声明了一个Ajaxquest
类,引入的时候其实是引入一个Ajaxquest
实例。
1 | class Ajaxquest { |
初始化
一般我们在使用axios的时候,有一些属性是可以设置固定的,比如timeout,baseURL等等,这里我把这些属性放在constructor中来初始化化:
1 | constructor () { |
request
这个Ajaxquest
类在外部使用的时候是直接使用它的实例的,所以实际是调用实例的方法来使用,而且一般我们调用axios都是设置一些配置,所以我们需要有一个request
的方法,这个方法支持传入axios的配置,然后在方法里面处理请求跟拦截。
axios的请求方法比较多,比如axios.create(options)
,axios.get(options)
等。这里我们直接使用axios.create(options)
,因为它的灵活性更高,可以配置methods:
1 | request (config) { |
在return service(config)
之前,我们还要处理一步拦截,因为很多时候,一些请求是需要在头部添加一些信息的,而这些信息有些是通用的,有些是个别请求要求携带的,所以可以通过config
传进来,然后再传到拦截器中处理。
1 | request (config) { |
这里面拦截器中的callback,除了请求发送前拦截错误的callback,其他都写成内部方法。这些callback的作用是对所有请求的共性拦截处理。
拦截
拦截器有请求前的拦截跟请求完毕后的拦截,每个拦截都会处理两个callback,因为请求前报错的处理比较少,只是打印报错信息跟返回Promise reject,所以只简单写了callback函数,没有写成内部方法。
请求前的拦截一般是为了配置头部信息,不在request
方法的axios.create()
中处理只是为了分开处理,是可以放在一起处理的。一些请求不需要配置头部信息,直接过滤掉,然后定义一些配置头部字段的,判断请求配置中是否带有这些属性,有则配置对应的头部信息。
1 | _interceptorsRequest (config) { |
请求完成之后,也做拦截,把请求成功跟失败后的共性处理分别独立放到一个callback中。
请求成功之后,一些全局性的信息就可以在拦截器中处理。比如用户的信息更新,就可以在拦截器中直接处理;
1 | _interceptorsResponse (response) { |
如果请求失败了,拦截就可以做一些请求失败的报错信息打印。
1 | // 这里用了vant的Toast组件 |
cancelToken
axios提供了cancelToken来处理取消请求。这里我们也来实现cancelToken的封装。
因为我们导出的是实例,写请求方法的时候只是调用了request()
方法,所以需要提供另一个方法来处理取消请求。另外,因为cancelToken的处理是需要在请求的时候先创建一个cancel token,所以就是说需要在调用request()
方法时提出需要创建cancel token,所以在request()
方法需要增加一个逻辑:
1 | request (config) { |
这样外部传入一个cancelToken
的布尔值,方法内部判断是否为真,是则创建cancelToken。
使用的时候,当需要取消请求,就可以直接调用abort()
方法:
1 | abort (notice = 'cancel a request') { |
最后
这个封装其实只是一个结构的封装,内部的配置可以根据不同的项目,不同的请求分类去做差异化的处理。封装的功能也主要是一些常用的请求处理,有其他需求还可以在这个基础上继续封装。