我正在编写拦截器,这样我就不必处理每个调用我的web API的服务中的头。这样做的问题是,99%的调用需要1个特定的头集,但其他1%只需要其中一个头,并且无法与其他现有的头一起工作。有了这个,我的想法是做2个拦截器,第一个将添加他们都使用的1头,第二个将添加其余的头,第二个排除1%。
下面是我如何排除1%的人,这是可行的,但我想看看是否有更好的方法来处理这一问题:
intercept(request: HttpRequest<any>, next:HttpHandler: Observable<HttpEvent<any>> {
let position = request.url.indexOf('api/');
if (position > 0){
let destination: string = request.url.substr(position + 4);
let matchFound: boolean = false;
for (let address of this.addressesToUse){
if (new RegExp(address).test(destination)){
matchFound = true;
break;
}
}
if (!matchFound){
...DO WORK to add the headers
}
}
7条答案
按热度按时间shstlldc1#
更新从Angular 12开始,使用context,参见此SO
我建议,尽管检查请求,你可以使用头部添加一个“跳过”属性,如果头部有跳过属性,简单地返回请求
而你打所有你需要的电话“跳过”拦截器就像
7ajki6be2#
在按照Eliseo的建议检查了
req.headers.get("skip")
之后,我建议从请求中删除这个头,因为它只与Angular相关,不应该传输到API(实际上它会导致问题)z2acfund3#
我最终做的是有一个url数组(Regex),我不想在拦截器中使用,如下所示:
iszxjhcz4#
在默认情况下创建时,HttpClient将使用拦截器。如果你想避免这种情况,你可以使用构造函数创建另一个HttpClient示例。
customHttpClient示例将不使用拦截器。
wribegjk5#
您可以尝试扩展HttpClient而不是使用Interceptor。
在Interceptor World中,每个请求在执行之前都会被停止-消息(添加头部)。
在HttpClient World中,在Client对象示例化时会注意这一点。
如果您认为有必要,您可以考虑使用不同的变体本身,HttpClient 99 Percent变体,HttpClientOnePercent变体等。
下面的链接可以给予你一个良好的开端:
https://medium.com/@admin_87321/extending-angular-httpclient-6b33a7a1a4d0
deikduxw6#
更新Андрей Керничный's answer
liwlm1x97#
}