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

news/2024/7/19 14:52:09 标签: java, http, vue, js, ajax
js_content">

https://img-blog.csdnimg.cn/img_convert/018b01e4bd66f69c1076f003be3150e7.gif" alt="018b01e4bd66f69c1076f003be3150e7.gif" />

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

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

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

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

https://img-blog.csdnimg.cn/img_convert/dff8bf0a3fd6633eff8b4d06e5dc808e.png" alt="dff8bf0a3fd6633eff8b4d06e5dc808e.png" />

C#请求/响应拦截器

https://img-blog.csdnimg.cn/img_convert/1d65b646cf13cca4379bfbd7afd62ab6.png" alt="1d65b646cf13cca4379bfbd7afd62ab6.png" />

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

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

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

https://img-blog.csdnimg.cn/img_convert/a7b36be8d2510aa17b2b9a3a4555d632.png" alt="a7b36be8d2510aa17b2b9a3a4555d632.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是最先接触到响应的。

------https://img-blog.csdnimg.cn/img_convert/cb392e0900c2a9097dfab7f19a0a0629.png" alt="cb392e0900c2a9097dfab7f19a0a0629.png" />https://img-blog.csdnimg.cn/img_convert/3198e8398559e41774aef187a97ff9f9.png" alt="3198e8398559e41774aef187a97ff9f9.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的内幕请点这里。

https://img-blog.csdnimg.cn/img_convert/f86b70d99ee3e882d1b2d0fc47a6fa3b.png" alt="f86b70d99ee3e882d1b2d0fc47a6fa3b.png" />

axios 拦截器

https://img-blog.csdnimg.cn/img_convert/6bbea5f1c25330f040121132e8eb7ed0.png" alt="6bbea5f1c25330f040121132e8eb7ed0.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请求/响应?https://img-blog.csdnimg.cn/img_convert/ff0fc3ff2f88ece59fd4d894e9f6c16a.png" alt="ff0fc3ff2f88ece59fd4d894e9f6c16a.png" />https://img-blog.csdnimg.cn/img_convert/38ba2951aa1cf9ec811271bc5e851801.png" alt="38ba2951aa1cf9ec811271bc5e851801.png" />

旁白

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

这就会给你一个感觉,你目前虽然不知道怎么写, 但是你知道它就在那里,它在那里,就在那里https://img-blog.csdnimg.cn/img_convert/04765c4637ad39f65eb261dd2bda6a53.png" alt="04765c4637ad39f65eb261dd2bda6a53.png" />......

https://img-blog.csdnimg.cn/img_convert/7c3683d912b45181bc62a3e4e0cbfadf.gif" alt="7c3683d912b45181bc62a3e4e0cbfadf.gif" />

●HttpClientFactory的套路,你知多少?

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

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

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

●大前端快闪二:react开发模式 一键启动多个服务http://mp.weixin.qq.com/s?__biz=MzI4NTU0NjYwOA==&mid=2247484721&idx=1&sn=e244dc59b0ba3fba69de333d73436219&chksm=ebebc42edc9c4d381732099da3a6afc60dbafdd2461027035b1185d7c3d770ba42f5db06127c&scene=21#wechat_redirect">

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

“赞”https://img-blog.csdnimg.cn/img_convert/a73ef8146c4f6afcae8c1d9eb489b57b.gif" alt="a73ef8146c4f6afcae8c1d9eb489b57b.gif" />“在看”https://img-blog.csdnimg.cn/img_convert/4c17c71971443c221e3894649701c8b7.gif" alt="4c17c71971443c221e3894649701c8b7.gif" />

体现态度很有必要!


http://www.niftyadmin.cn/n/1864470.html

相关文章

Google Latitude 试用手记

上周五&#xff0c;Google 发布 了一款备受期待的位置跟踪服务&#xff1a;Latitude 。该服务使用智能手机&#xff08;如 Google Android, BlackBerry, Windows Mobile&#xff09;内置的 GPS 将你当前位置定位到地图以向朋友们分享。Robert Strohmeyer 在 PC World 撰文分享了…

SignalR在React/Go技术栈的实践

哼哧哼哧半年&#xff0c;优化改进了一个运维开发web平台。本文记录SignalR在react/golang 技术栈的生产小实践。01背景有个前后端分离的运维开发web平台&#xff0c; 后端会间隔5分钟同步一次数据&#xff0c;现在需要将最新一次同步的时间推送到web前端。说到[web服务端推送]…

SingnalR 开发到生产部署闭坑指南

前天倒腾了一份[SignalR在react/go技术栈的实践01SignalR默认要协商传输方式SignalR 默认要求协商传输方式[1]不管是.NET客户端还是JavaScript客户端&#xff0c;构建连接时都存在一个默认配置&#xff1a;SkipNegotiationfasle&#xff0c;负负得正就等于要求协商&#xff0c;…

Gitflow branch与Docker image tag命名冲突怎么办?

谷歌还是比必应要好用一点。在前公司&#xff0c;我根据主流的git flow 给团队搭建了一套devops流程&#xff0c;运行在 docker & k8s上。在现代devops流程中&#xff0c;一般推荐使用git分支名或者git tag作为镜像的tag名。在实际操作中&#xff0c; 我遇到了一个流程阻塞…

Hostonly cookie是什么鬼?

点击上方蓝字关注我们吧知道cookie hostonly属性的请举手&#x1f9d0;01Cookie常见姿势、疑难梳理目前w3c定义浏览器存放每个cookie需要包含以下字段&#xff1a;cookie属性基本描述举例备注namevaluecookie键值对ida3fWaexpirescookie过期时间expiresTue, 10-Jul-2013 08:30:…

HTTP1.1 Keep-Alive到底算不算长连接?

✎ 码甲说 在基础架构部浸润了半年&#xff0c;有一些认知刷新想和童靴们交代一下&#xff0c; 不一定全面&#xff0c;仅代表此时的认知&#xff0c; 也欢迎筒靴们提出看法。本文聊一聊口嗨用语&#xff1a;“长连接、短连接”&#xff0c; 文章会按照下面的思维导图来讲述&…

域名可以运行了!

之前跟丹雅要的那个域名&#xff0c;终于可以正常运行了。简单的记录一下从申请到开通的过程&#xff0c;以便之后查阅。 1&#xff0c;首先去申请你的域名&#xff0c;当然缴费是必然的了。提供域名注册服务的网站很多&#xff0c;万维啊什么的。我是不劳而获&#xff0c;所以…

宝藏好物gRPCurl

gRPCurl简介gRPCurl[1]是一个与gRPC服务器交互的命令行工具&#xff0c;可认为是gRPC的curl工具。gRPCurl用于从命令行调用gRPC服务器支持的RPC方法&#xff0c;gRPC使用二进制编码(protobuf), 不能利用常规的curl工具(早期的curl版本还不支持HTTP/2)。1. gRPCurl工具接受json编…