Angular 8 - HttpInterceptor - 读取响应头信息

13

我在HttpInterceptor的响应中缺失了http头。我可以获取正文内容但无法获取头部信息。请查看附带的输出和我的代码。

@Injectable()
export class ApiVersionInterceptor implements HttpInterceptor {
    intercept(
        req: import("@angular/common/http").HttpRequest<any>,
        next: import("@angular/common/http").HttpHandler
    ): import("rxjs").Observable<import("@angular/common/http").HttpEvent<any>> {
        return next.handle(req).pipe(
            tap(httpEvent=>{
                // Skip request
                if(httpEvent.type === 0){
                    return;
                }
                console.log("response: ", httpEvent);
            })

        );
    }
}

在这里输入图片描述

2个回答

23

哇哈哈,我解决了我的问题。

这不是Angular的问题,而是服务器的问题。我需要添加另一个头文件:

"access-control-expose-headers": "mintargetapiversion"

如果在“access-control-expose-header”中没有指定自定义头,则Angular会忽略它们。


3

使用以下方式使用httpEvent.headers.get()方法:

@Injectable()
export class ApiVersionInterceptor implements HttpInterceptor {
    intercept(
        req: import("@angular/common/http").HttpRequest<any>,
        next: import("@angular/common/http").HttpHandler
    ): import("rxjs").Observable<import("@angular/common/http").HttpEvent<any>> {
        return next.handle(req).pipe(
            tap((httpEvent: HttpEvent<any>) =>{
                // Skip request
                if(httpEvent.type === 0){
                    return;
                }           
                console.log("response: ", httpEvent);

                let minTargetApiVersion : string;
                if (httpEvent instanceof HttpResponse) {
                    if(httpEvent.headers.has('mintargetapiversion')) {
                        minTargetApiVersion = httpEvent.headers.get('mintargetapiversion');
                    }
                }
            })

        );
    }
}

我之前尝试过,但出现了错误:类型“HttpEvent<any>”上不存在属性“headers”。我无法解决这个问题。 - Lopuch
1
我通过tap((httpEvent: any)=>{修复了它,但IF语句总是为false。httpEvent.headers.get('mintargetapiversion')将始终返回null。 - Lopuch
2
我在想为什么第一个控制台日志中没有列出http头,加入你的 if (httpEvent instanceof HttpResponse) { ... 后,它就像魔法一样工作了。这与头部 "access-control-expose-headers" 结合使用,可以读取非标准的http头。谢谢! - Bobby_Cheh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接