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

问题描述

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

谢谢!

解决方法

我相信您表单的内容是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';
    }

干杯!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...