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