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

时间:2020-09-03 14:57:32

标签: angular angular-http-interceptors

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

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'),因此我设置了错误的类型,调用失败。我在做什么错了?

谢谢!

3 个答案:

答案 0 :(得分:1)

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

if(req.body instanceof FormData)

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

答案 1 :(得分:1)

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

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

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

但是,这可能是一个过大的杀伤力。

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

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

答案 2 :(得分:0)

根据您的建议,我提出了一个非常简单的解决方案,即将Content-Type标头保留为原样(如果请求正文是表单数据),其余设置为JSON。像这样:

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

干杯!