繁体   English   中英

无法从 Angular HTTP 拦截器获取请求标头值

[英]Can't get request headers values from Angular HTTP interceptor

在 Angular 应用程序中,我使用拦截器将令牌(在需要时)注入到请求标头中。 我还需要它将Content-Type标头修改为适当的标头。 默认情况下,它必须是application/json ,但是有一个调用需要上传一个 ZIP 文件,所以我想让Content-Type标头保持原样(对于这些情况,它类似于: Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvamnUWepE840OEuq )。 我使用这个代码:

    intercept (req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        let usr = this.userService.getActualUser();
        let confirmationToken = '';
        let credentials = false;
        let contentType = 'application/json';
        
        // Check if the incoming request has an specific content type header
        if (req.headers.has('Content-Type')) {
          contentType = req.headers.get('Content-Type');
        }
    
        // ETC
    }

问题是req.headers.has('Content-Type')总是返回false ,所以我设置了错误的类型并且调用失败。 我究竟做错了什么?

提前致谢!

我相信您的表单内容是 FormData 对象的一个​​实例? 如果是这样的话,

if(req.body instanceof FormData)

如果您无法访问标题,此检查可能会帮助您或给您一些提示。 或者,您甚至可以更深入地检查req.body对象以进行更具体的检查。

在您的请求期间,您希望看到content-type但除非您直接指定它,否则您不会看到。

如果您有此要求,您将看到内容类型。

return this.http.get(this.ENDPOINT, {
      headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
})

然而,这可能是一种矫枉过正。

另一种可能的解决方案是检查正文的实例类型,然后相应地设置标题

if (req.body instanceof FormData) {
    contentType = 'multipart/form-data';
}

按照您的建议,我想出了一个非常简单的解决方案,即保留Content-Type标头,就好像请求正文是表单数据一样,其余的设置为 JSON。 就像是:

    if(!(req.body instanceof FormData)) {
      contentType = 'application/json';
    }

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM