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{...})
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; }
仔细围观use
sdk,支持传入两个函数,
表示请求(响应)一旦准备好了/失败了,你可以注入的动作。
精简代码如下:
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请求/响应?