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

0d01998392b08bc7da9163ce775c5273.gif

      码甲哥继续在同程艺龙写一点大前端,今天我们来了解一下如何拦截axios请求/响应?这次我们举一反三,用一个最舒适的姿势插入这个技能点。

本文阅读耗时5 minute,行文耗时5 Days。

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

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

62592b11c1c0a579b335ce7bd268010f.png

C#请求/响应拦截器

715f55840767fa9b8bc78de78fd6e2a0.png

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

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

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

a09fb4d675261bcdbd7a43c3190f8026.png

(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是最先接触到响应的。

------6c402d27948f66ef9d4709823a74c7c1.pngc1d2eb79df8fa939f8b75466c3e00e9f.png以上是.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的内幕请点这里。

98e543c7026016544037b8dba748e117.png

axios 拦截器

f877964231f932939e02a197f6cf7a66.png

      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请求/响应?3f56f499154ceef08bbec6bf34a4eb6e.png308f1d703377005f07a508b61afd2897.png

旁白

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

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

d03e13a12d36d13ee9b24eb4cb4fa434.gif

●HttpClientFactory的套路,你知多少?

●HttpClientFactory日志不好用,自己扩展一个?

●我又踩坑了!如何为HttpClient请求设置Content-Type标头?

●前端快闪三:多环境灵活配置react

●大前端快闪二:react开发模式 一键启动多个服务

●大前端快闪:package.json文件知多少?

“赞”161e74e59397f55d961c3c3aa4668f12.gif“在看”496e56115d9bcfd9c89a29b688e734ea.gif

体现态度很有必要!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

甜蜜助攻!情侣之间,到底能有多甜甜甜甜甜甜甜甜

▲ 点击查看没有一丝丝防备&#xff0c;还有 5 天&#xff0c;七夕就要到了。如何借「物」聊表爱意&#xff0c;大概是最近让很多拥有另一半的人头疼不已的问题。重点是&#xff0c;礼物挑不好&#xff0c;小心七夕就变送命题&#xff01;女孩子们到底喜欢什么礼物&#xff1f;…

多个查询语句能否一次把结果导出_mysql表中base64格式数据查询

需求&#xff1a;为了避开特殊字符(如&#xff1a;单引号)影响&#xff0c;把某些字段保存为base64格式。SQL语句直接解码base64编码数据&#xff0c;直接查询出原始数据。表中数据如下很不直观&#xff0c;当根据where条件查询时&#xff0c;肉眼不能直接从结果提取到可读信息…

【转帖】Reporting Service rdl报表,在aspx页面显示一张完整的RDL报表

第一次弄RDL报表. 权当自己的一个随手笔记吧.希望能有好的意见或者建议欢迎大家提出来. 一起学习.灰常欢迎.. 第一步,先找出你的Reporting Server 的 URL . 如图&#xff1a; 其中URL 就是ReportingServer 的URL 在新建的aspx页面部署的时候非常重要. 虚拟目录的话,在WIN 7 上…

志愿者招募 | 2021 .NET Conf China

回顾往届 .NET Conf China 活动志愿者团队承担着非常重要的职责参与到活动组织和安排过程的方方面面志愿者的团队协作和专业素养展示出了高度的凝聚力和号召力无私付出和敬业得到了多方的好评今年&#xff0c;我们诚邀更多志愿者加入与助力为 2021年中国 .NET 开发者大会提供志…

数学上最有趣的数,装得了逼,撩得了妹!

全世界只有3.14 % 的人关注了爆炸吧知识一分钟记住走马灯数那些美丽有趣的自然数一定有它存在的意义&#xff0c;就像帅气逼人的超模君依然具有令人羡慕的才华。但是&#xff0c;存在这么一些自然数&#xff0c;例如走马灯数一直被视为无用&#xff0c;一身正气的超模君决定找到…

php运算符优先级题目,详解php运算符优先级

php中&#xff0c;一个运算可能是有多个运算符连接在一起的&#xff0c;我们给其运算的执行决定先后顺序&#xff0c;下面由小编给大家介绍php运算符优先级&#xff0c;希望对需要的朋友有所帮助&#xff01;在php运算中遵循的规则就是&#xff1a;优先级高的运算符优先执行&am…

阿里开发规范文档_华为阿里等技术专家15年开发经验总结:SSM整合开发实战文档...

前言Spring自2002年诞生至今&#xff0c;已有近20年的历史&#xff0c;虽然几经变迁&#xff0c;但始终在继续发展和精进。Spring目前由Pivotal维护和开发。Pivotal是PaaS&#xff08;平台即服务&#xff09;的领导者&#xff0c;也是消息中间件RabbitMQ的缔造者。12306的流量销…

Swift中的区间运算符和半开区间运算符

2019独角兽企业重金招聘Python工程师标准>>> 区间&#xff0c;使用三个点表示&#xff08;a...b&#xff09;&#xff0c;表示从a到b&#xff0c;包含a和b&#xff0c;b要大于a&#xff0c;包含第一个和最后一个 半开区间&#xff0c;&#xff08;a..<b&#xf…

使用 Directory.Build 来消除项目文件中的重复配置

使用 Directory.Build 来消除项目文件中的重复配置Intro如果解决方案里的项目比较多的话&#xff0c;往往会有很多重复的项目属性&#xff0c;通常我们可以使用独立的 props 属性文件来配置公用的属性&#xff0c;而一般的属性文件都需要手动的 Import 到项目文件中&#xff0c…

chromium关闭更新_Win10今年最重磅更新!Win10 2004正式版详尽体验

今年首个Windows 10正式版更新于近日上架MSDN&#xff0c;版本号最终确定为Build 19041.208(v2004)&#xff0c;这是一个RTM版本&#xff0c;也就是送到OEM厂商压盘的正式版本&#xff0c;向用户正式推送的时候不会再有什么功能变化。按照微软的一贯逻辑&#xff0c;上半年更新…

Android网络通信的六种方式示例代码

表1展示了Android SDK中的一些与网络有关的API包名表1. Android SDK 网络包包 描述 API LevelJava.net 提供与联网有关的类&#xff0c;包括流和数据包&#xff0…

技术分享 | 业务模板的技术实践

源宝导读&#xff1a;“业务模板”作为天际建模平台3.0推出的重要特性&#xff0c;它将元数据复用发挥到了极致&#xff0c;通过业务模板几乎可以覆盖整个建模元数据开发流程&#xff0c;提供业务场景级别的复用能力。本文将介绍“业务模板”的设计原理、实现方案和应用场景。一…

为什么那么好的女孩子还单身?

1 终于知道家里的吃的都是怎么没的了&#xff01;2 我的小鱼干&#xff01;快给我&#xff01;3 这几只狗子真是太皮了&#xff01;4 您点的肉香满溢披萨到了~5 一位新手爸爸分享了自己关于为人父母的感悟6 应采儿&#xff1a;为什么那么好的女孩子还单身&#xff1f; 陈小春&a…

RHCS创建高可用集群apche服务器

实验环境&#xff1a; 系统版本&#xff1a;RHEL5.4 将selinux关闭&#xff0c;刷新iptables -F 配置yum仓库 192.168.0.25 station25.example.com 宿主机 192.168.0.24 station24.example.com 节点(虚拟机) 192.168.0.39 station39.example.com 节点(…

成不了天才,但为何也没成人材?(转)

长期以来&#xff0c;"软件业"一直被视为"智力密集"型的"朝阳"产业&#xff0c;大多数从业者都受过高等教育&#xff0c;其平均素质居于社会各行业的前列&#xff0c;这个产业的顶尖人物被公众视为"知识英雄"&#xff0c;比如微软公司…

.NET 6 RC2 版本发布

原文&#xff1a;bit.ly/3FS9xm7作者&#xff1a;Richard日期&#xff1a;2021-10-12翻译&#xff1a;精致码农-王亮说明&#xff1a;文中有大量的超链接&#xff0c;这些链接在公众号文章中被自动剔除&#xff0c;一部分包含超链接列表的小段落被我删减了&#xff0c;如果你对…

最诡异数学悖论:1+1=1

全世界只有3.14 % 的人关注了爆炸吧知识今天&#xff0c;8岁表妹的老师给她奖励了一块大巧克力&#xff0c;超模君打趣她能不能分给我点&#xff0c;遭到残忍拒绝&#xff0c;超模君很愤怒&#xff0c;暗下决心要神不知鬼不觉地吃上表妹的巧克力。超模君趁表妹在认真做作业的时…

JS URL Parser

为什么80%的码农都做不了架构师&#xff1f;>>> /** *param {string} url 完整的URL地址 *returns {object} 自定义的对象 *description 用法示例&#xff1a;var myURL parseURL(http://abc.com:8080/dir/index.html?id255&mhello#top); myURL.fileindex.ht…

如何使用Instruments诊断App(Swift版):起步

2019独角兽企业重金招聘Python工程师标准>>> 本文由Mr_cyz&#xff08;博客&#xff09;翻译自raywenderlich&#xff0c;欢迎参与我们的翻译活动。原文&#xff1a;Instruments Tutorial with Swift: Getting Started 更新记录&#xff1a;该教程由 James Frost 更…

tcp抓包返回fin_TCP/IP学习二TCP链接建立与断开

今天详细学习下TCP链接的三次握手四次挥手&#xff0c;因为开发web服务还是会经常遇到一些网络问题的。其实这方面的资料很多&#xff0c;可能我们看过很多次但也忘了无数次[捂脸]&#xff0c;这次我主要通过抓包例子来展示这个过程。TCP传输控制协议(TransmissionControlProto…