这次使用一个舒服的姿势插入HttpClient拦截器技能点

开发 前端
axios是一个基于 promise 的网络请求库,可以用于浏览器和 node.js;promise 类似于C#的Task async/await机制,以同步的代码风格编写异步代码。

[[427901]]

本文转载自微信公众号「精益码农」,作者有态度的马甲。转载本文请联系精益码农公众号。

axios是一个基于 promise 的网络请求库,可以用于浏览器和 node.js;promise 类似于C#的Task async/await机制,以同步的代码风格编写异步代码;

而axios拦截器就类似于 C# HttpClient自定义message Handler, 给你一个请求/响应在被handler之前做一些自定义动作的机会。

C#请求/响应拦截器

axios请求/响应拦截器的定位就类似于 C# HttpClient的自定义message handler。

.NET默认的message handler是HttpClientHandler,开发者可以插入自定义的message handler。

用途举例 ① 插入日志 ② 插入自定义Header

(1) 更具体的就是System.Net.Http.DelegatingHandler类,开发者重写SendAsync方法,可以拦截请求/响应, 注入动作。

  1. protected override Task<HttpResponseMessage> SendAsync( 
  2.      HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) 

自定义message handler形成的是pipeline, 肉眼可猜测使用的是责任链模式。

(2) 添加自定义message handler

使用HttpCLientFactory.Create方法:

  1. HttpClient client = HttpClientFactory.Create(new MessageHandler1(), new MessageHandler2()); 

自定义message handler的执行顺序,是传入Create方法的顺序,也就是说,上面最后一个handler是最先接触到响应的。

------以上是.NET Framework插入拦截器的用法-------

推及到.NET Core, 因为大量应用了提前配置&&依赖注入,实际由IHttpClientFactory来注入HttpClient。

提前配置HttpClient拦截器的代码如下:

  1. services.AddHttpClient("bce-request", x => 
  2.                    x.BaseAddress = new Uri(Configuration.GetSection("BCE").GetValue<string>("BaseUrl"))) 
  3.                 .ConfigureHttpMessageHandlerBuilder(_=> new LoggerMessageHandler{...} )    
  4.                 .ConfigurePrimaryHttpMessageHandler(_ => new BceAuthClientHandler{...}) 

更多有关.NET Core IHttpClientFactory的内幕请点这里。

axios 拦截器

axios一般发起的是ajax请求,我们一般会封装处理一些通用的请求/响应动作。

码甲哥就遇到:

(1) 在每次ajax跨域请求时,允许携带第三方凭据(cookie、authorization)

(2) 封装4xx响应码的处理逻辑

其中就要用到axios的拦截器:

  1. export interface AxiosInterceptorManager<V> { 
  2.   use<T = V>(onFulfilled?: (value: V) => T | Promise<T>, onRejected?: (error: any) => any): number; 
  3.   eject(id: number): void; 

仔细围观usesdk,支持传入两个函数,

表示请求(响应)一旦准备好了/失败了,你可以注入的动作。

精简代码如下:

  1. import axios from 'axios'
  2. import { 
  3.     message 
  4.   } from 'antd' 
  5.  
  6. const service = axios.create({ 
  7.     baseURL: process.env.REACT_APP_APIBASEURL,  
  8.     timeout: 5000 
  9. }) 
  10. // 添加请求拦截器 
  11. service.interceptors.request.use((reqconfig) => { 
  12.     reqconfig.withCredentials = true
  13.     return reqconfig; 
  14. }, (error) => { 
  15.     return Promise.reject(error); 
  16. }); 
  17.  
  18. // 添加响应拦截器 
  19. service.interceptors.response.use((response) => { 
  20.     return response; 
  21. }, (error) => { 
  22.     if (error.response && error.response.status === 401) { 
  23.         message.error("无权限操作,请联系tvs运维."
  24.     } 
  25.     return Promise.reject(error); 
  26. }); 

以上对于前端老鸟不值一提,但是上述拦截动作对于把握全栈web开发必不可少。

本文另作为前端快闪四:如何拦截axios请求/响应?

 

责任编辑:武晓燕 来源: 精益码农
相关推荐

2009-06-24 16:00:00

2021-11-03 17:04:11

拦截器操作Servlet

2009-09-27 17:37:32

Hibernate拦截

2021-05-17 08:11:24

Axios 开源项目HTTP 拦截器

2023-09-05 08:58:07

2020-03-25 17:55:30

SpringBoot拦截器Java

2011-05-16 10:14:11

Hibernate

2009-07-08 17:02:11

JDK实现调用拦截器

2011-11-21 14:21:26

SpringMVCJava框架

2009-06-25 15:54:42

Struts2教程拦截器

2020-10-16 16:28:54

Python开发技术

2009-06-25 15:59:21

Struts2教程拦截器

2017-02-06 10:30:13

iOS表单正确姿势

2012-02-03 13:27:16

2009-02-04 14:19:38

2009-06-04 08:01:25

Struts2拦截器原理

2013-11-04 09:35:38

Firefox插件拦截FLASH

2009-02-04 14:45:06

2009-05-19 16:55:17

IE拦截器恶意软件卡巴斯基

2023-03-10 19:36:47

点赞
收藏

51CTO技术栈公众号