如何使用http拦截器在angular中获取响应头

如何使用http拦截器在angular中获取响应头,angular,angular-httpclient,Angular,Angular Httpclient,如何读取httpinteceptor在angular中实现的响应头。我已经公开了节点应用程序中的所有令牌。因为我无法读取响应头中传递的所有键 intercept(req: HttpRequest<any>, next: HttpHandler) { return next .handle( req.clone({ headers: req.headers.append('API-Token', 'token')

如何读取httpinteceptor在angular中实现的响应头。我已经公开了节点应用程序中的所有令牌。因为我无法读取响应头中传递的所有键

intercept(req: HttpRequest<any>, next: HttpHandler) {
      return next
        .handle(
          req.clone({
            headers: req.headers.append('API-Token', 'token')
          })
        )
        .pipe(
          tap((res: HttpEvent<HttpEventType>)  => {
            if (res instanceof HttpResponse) {
              console.log(res)
            }

          }),
          catchError({
            throw err;
          })
        );
    }
....

问题是您没有在
选项
部分中设置标题,而是将标题附加到
正文
中,这就是为什么:p所以只需更改此行

headers: req.headers.append('API-Token', 'token')
为此:

request.clone({  setHeaders: {  'API-Token': 'token'  }   });
在此之后,您可以在
HttpResponse

  intercept( request: HttpRequest<any>,next: HttpHandler ): Observable<HttpEvent<any>> {

                return next.handle(req).pipe(
                    tap(res=> {
                        if (res instanceof HttpResponse) {
                               console.log( res.headers.get('API-Token'));                                   
                        }
                    }),
                    catchError((err: any) => {
                           console.log(err)
                        return of(err);
                    }));

              }

        }

问题是您没有在
选项
部分中设置标题,而是将标题附加到
正文
中,这就是为什么:p所以只需更改此行

headers: req.headers.append('API-Token', 'token')
为此:

request.clone({  setHeaders: {  'API-Token': 'token'  }   });
在此之后,您可以在
HttpResponse

  intercept( request: HttpRequest<any>,next: HttpHandler ): Observable<HttpEvent<any>> {

                return next.handle(req).pipe(
                    tap(res=> {
                        if (res instanceof HttpResponse) {
                               console.log( res.headers.get('API-Token'));                                   
                        }
                    }),
                    catchError((err: any) => {
                           console.log(err)
                        return of(err);
                    }));

              }

        }
您可以尝试以下方法:

从'@angular/core'导入{Injectable};
从“rxjs”导入{可观察,主题,of};
从“./message/message.service”导入{MessageService};
从“./log/log.service”导入{LogService};
从“./auth/token.service”导入{TokenService};
从“/utils/utils.service”导入{UtilsService};
从“@angular/common/http”导入{HttpClient、HttpInterceptor、HttpHandler、HttpRequest、HttpEvent、HttpResponse、HttpErrorResponse、HttpHeaders};
导出接口IvalOnErrorInfo{
消息:字符串;
成员:字符串[];
}
导出接口信息{
代码:编号;
消息:字符串;
详细信息:字符串;
验证错误:IValidationErrorInfo[];
}
导出接口响应{
成功:布尔;
结果:有;
targetUrl?:字符串;
错误?:IErrorInfo;
未经授权的请求:布尔值;
__app:布尔型;
}
@可注射()
导出类appHttpConfiguration{
建造师(
私有消息服务:消息服务,
专用(日志服务:日志服务){
}
defaultError={
消息:“发生错误!”,
详细信息:“服务器未发送错误详细信息。”
};
defaultError401={
消息:“您未通过身份验证!”,
详细信息:“您应该经过身份验证(登录)才能执行此操作。”
};
defaultError403={
消息:“您未被授权!”,
详细信息:“不允许您执行此操作。”
};
defaultError404={
消息:“未找到资源!”,
详细信息:“在服务器上找不到请求的资源。”
};
logError(错误:IErrorInfo):无效{
此._logService.error(错误);
}
淋浴ROR(错误:IErrorInfo):任何{
如果(错误详细信息){
返回此.u messageService.error(error.details,error.message | | this.defaultError.message);
}否则{
返回此.u messageService.error(error.message | this.defaultError.message);
}
}
handleTargetUrl(targetUrl:string):无效{
如果(!targetUrl){
location.href='/';
}否则{
location.href=targetUrl;
}
}
handleUnAuthorizedRequest(messagePromise:any,targetUrl?:字符串){
const self=这个;
如果(信息承诺){
messagePromise.done(()=>{
this.handleTargetUrl(targetUrl | |'/);
});
}否则{
self.handleTargetUrl(targetUrl | |'/');
}
}
handleNonappErrorResponse(响应:HttpResponse){
const self=这个;
开关(响应状态){
案例401:
自我授权请求(
自动淋浴错误(自动默认错误401),
'/'
);
打破
案例403:
self.showError(self.defaultError403);
打破
案例404:
self.bathror(self.defaultError404);
打破
违约:
self.bathror(self.defaultError);
打破
}
}
handleappResponse(响应:HttpResponse,ajaxResponse:IAjaxResponse):HttpResponse{
var newResponse:HttpResponse;
if(ajaxResponse.success){
newResponse=response.clone({
正文:ajaxResponse.result
});
if(ajaxResponse.targetUrl){
this.handleTargetUrl(ajaxResponse.targetUrl);;
}
}否则{
newResponse=response.clone({
正文:ajaxResponse.result
});
如果(!ajaxResponse.error){
ajaxResponse.error=this.defaultError;
}
this.logError(ajaxResponse.error);
this.bathror(ajaxResponse.error);
如果(response.status==401){
this.handleUnAuthorizedRequest(null,ajaxResponse.targetUrl);
}
}
返回新的响应;
}
getappAjaxResponseOrNull(响应:HttpResponse):IAjaxResponse | null{
如果(!response | |!response.headers){
返回null;
}
var contentType=response.headers.get('Content-Type');
如果(!contentType){
此._logService.warn('未发送内容类型!');
返回null;
}
if(contentType.indexOf(“application/json”)<0){
此._logService.warn('Content-Type不是application/json:'+contentType);
返回null;
}
var responseObj=JSON.parse(JSON.stringify(response.body));
如果(!responseObj.\uu应用程序){
返回null;
}
返回responseObj作为iajax响应;
}
HandlerResponse(响应:HttpResponse):HttpResponse{
var ajaxResponse=this.getappAjaxResponseOrNull(响应);
如果(ajaxResponse==null){
返回响应;
}
返回此.handleappResponse(响应,ajaxResponse);
}
blobToText(blob:any):可观察{
返回新的观察值