zoukankan      html  css  js  c++  java
  • 从一个舒服的姿势插入 HttpClient 拦截器技能点

    马甲哥继续写一点大前端,阅读耗时5 minute,行文耗时5 Days
    今天我们来了解一下如何拦截axios请求/响应? 这次我们举一反三,用一个最舒适的姿势插入这个技能点。

    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方法,可以拦截请求/响应, 注入动作。

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

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

    (2) 添加自定义message handler

    使用HttpCLientFactory.Create方法。

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

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

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

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

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

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

    有关.NET Core IHttpClientFactory的内幕请看这里。

    axios拦截器

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

    码甲哥就遇到:

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

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

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

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

    仔细围观usesdk,支持传入两个函数,
    表示请求(响应)一旦准备好了/失败了,你可以注入的动作。

    精简代码如下:

    import axios from 'axios';
    import {
        message
      } from 'antd'
    
    const service = axios.create({
        baseURL: process.env.REACT_APP_APIBASEURL, 
        timeout: 5000
    })
    // 添加请求拦截器
    service.interceptors.request.use((reqconfig) => {
        reqconfig.withCredentials = true;
        return reqconfig;
    }, (error) => {
        return Promise.reject(error);
    });
    
    // 添加响应拦截器
    service.interceptors.response.use((response) => {
        return response;
    }, (error) => {
        if (error.response && error.response.status === 401) {
            message.error("无权限操作,请联系tvs运维.")
        }
        return Promise.reject(error);
    });
    

    以上对于前端老鸟不值一提,但是上述拦截动作对于把握全栈web开发必不可少。
    本文另作为 前端快闪四: 如何拦截axios请求/响应?

    旁白

    当你的基础知识体系形成了知识树,你会发现各种语言的对于某个技能点的实现都是同一种套路,差别只在于场景。

    这就会给你一个感觉,你目前虽然不知道怎么写, 但是你知道它就在那里,它在那里,就在那里......


    本文来自博客园,作者:{有态度的马甲},转载请注明原文链接:https://www.cnblogs.com/JulianHuang/p/15392403.html

    欢迎关注我的原创高价值公众号

    上海鲜花港 - 郁金香
  • 相关阅读:
    TDengine在上海电气储能智慧运维系统中的应用
    一文带你理解TDengine中的缓存技术
    taosAdapter正式发布:支持从OpenTSDB向TDengine无缝迁移
    TDengine 在中节能风力发电运维系统中的落地实践
    格创东智选择 TDengine,实现海量数据实时全生命周期管理
    TDengine 在水电厂畸变波形分析及故障预判系统中的应用
    使用wireshark抓包分析TCP三次握手
    K8s中 蓝绿部署、金丝雀发布、滚动更新汇总
    K8s运维锦囊,19个常见故障解决方法
    一次由 Kubernetes HostPort 引发的服务故障排错记实
  • 原文地址:https://www.cnblogs.com/JulianHuang/p/15392403.html
Copyright © 2011-2022 走看看