我用的是Angular 4.3.1和HttpClient,有一个HttpInterceptor来设置一些头。
在一些http get请求中我需要设置一个不同的头。有没有什么方法可以为那个特定的HttpRequest传递一些参数给这个HttpInterceptor?
@Injectable()
export class MyHttpInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if(request.custom.param1) // how can i do this
request = request.clone({
setHeaders: {
'header1': 'xxxxxx'
}
});
else
request = request.clone({
setHeaders: {
'header2': 'yyyyyy'
}
});
return next.handle(request);
}
}
7条答案
按热度按时间bprjcwpo1#
我编写了一个拦截器来处理Http错误响应。我希望允许特定的Http调用来指示拦截器忽略某些响应状态代码,同时还保留向Http调用传递参数的能力。以下是我最终得到的解决方案。(谢谢Aleksey在回答中提出的最初想法)。
扩展HttpParams:
拦截器:
fkaflof62#
也许有更好的方法来处理这个问题,但是作为一种解决方案,您可以创建自定义
HttpParams
并将其传递给请求,然后在拦截器中检查它们。在http调用中使用此类:
现在在拦截器中:
2eafrhcq3#
在“Angular 12+”中,有一个新属性
HttpRequest.context
用于解决此问题。拦截器可以使用的共享和可变上下文https://angular.io/api/common/http/HttpRequest#context
k2arahey4#
目前,Angular不支持通过HttpRequest对象传递“拦截器配置/元数据”(它已经成为open issue很长一段时间了)。
作为一种可能的解决方案,我们可以定义一个新的
MyHttpParams
类,它扩展了Angular的HttpParams
,添加了一个新的interceptorMetadata
属性。注意
MyHttpParams
必须覆盖append
,set
和delete
方法,以便它们返回MyHttpParams
而不是Angular的HttpParams
。如果我们不这样做,当这些方法被调用时,我们的interceptorMetadata
将被“丢弃”(例如,如果拦截器添加了一些HTTP参数,下一个拦截器将不会获得interceptorMetadata
)。例如,当调用HttpClient.get()时,我们可以传递扩展的MyHttpParams的示例:
最后,在拦截器中,我们可以使用
interceptorMetadata
:感谢JWess提供的原始答案(只是缺少
append
、set
和delete
覆盖)kuhbmx9i5#
您可以使用请求的setParam选项。
}
kfgdxczn6#
对于遇到同样问题的人,我们可以在新版本的angular中在HttpParams中传递自定义参数。但是我们必须记住,HttpParams是一个不可变的对象。对于一个不可变的对象,每次调用params.append()都会返回一个新对象。因此,我们必须将返回的新对象重新赋值给params,如下所示:
在拦截器中,我们可以访问值本身
ngynwnxp7#
正如@btx所说,自Angular 12 +以来,有一个新属性HttpRequest.context,可用于在HttpClient和HttpInterceptor之间共享数据。
下面是一个示例代码,用于为每个安全请求添加Authorization报头。