带有发布请求的 Angular 6 标头不起作用

Posted

技术标签:

【中文标题】带有发布请求的 Angular 6 标头不起作用【英文标题】:Angular 6 headers with post request does't work 【发布时间】:2019-04-15 09:59:55 【问题描述】:

我的前端使用 Angular 6,服务器使用基于 Core2 的 Web API。我写了这段代码,当我使用 ASP.NET 客户端时,它可以工作,但是使用 Angular 我遇到了一些麻烦。

services.AddMvc():
services.AddCors(o => o.AddPolicy("FreePolicy", builder =>

    builder.WithHeaders(<redacted>)
    //builder.AllowAnyHeader()
    .AllowCredentials()
    .AllowAnyMethod()
    .AllowAnyOrigin();
));

如果我评论 builder.WithHeaders 并取消评论 builder.AllowAnyHeader,错误就会消失,否则 Angular 会崩溃。

我的标题:

这看起来像是因为“MaybeUnknown”而出现错误的地方。您可以在值周围看到括号,因此这看起来像一个数组。我可以修复它吗?它会解决我的问题吗?

如果我不取消注释 builder.AllowAnyHeader,我在服务器上发布请求后会出现错误。

更新

我在服务器端的标题

客户端上的我的标题

更新 2 配置方法

更新 3

【问题讨论】:

根据您的描述,我猜您正在发送带有自定义标头的请求,但您没有同时在服务器端配置标头。检查客户端的 ajax 和服务器端的标头。如果您仍然无法解决问题,请向我们展示 WithHeaders(&lt;redacted&gt;) 行和 Angular 中的 ajax 部分代码,让我们知道将发送到服务器的内容。 @itminus 我更新了帖子,请检查一下。谢谢。 【参考方案1】:

从您发布的最新屏幕截图中可以清楚地看出,该屏幕截图显示了通过 Chrome 发出的 HTTP 请求,您的 WithHeaders 调用中缺少标头。如果您查看请求中的 Access-Control-Request-Headers,您会看到它包含 四个 标头:

哎呀 客户端 ID zump-api-版本 内容类型

但是,您的WithHeaders 调用确实包含Content-Type,因此您需要添加:

builder.WithHeaders("client-id", "zump-api-version", "apiss", "content-type")
    ...

注意:这都是不区分大小写的,所以你可以用你喜欢的任何方式来区分大小写。

在 MDN 文档中有更多相关信息:Access-Control-Allow-Headers,其中包括以下解释:

请注意,某些标头始终是允许的:Accept、Accept-Language、Content-Language、Content-Type(但仅限应用程序/x-www-form-urlencoded 的解析值(忽略参数)的 MIME 类型,多部分/表单数据或文本/纯文本)。这些称为简单标头,您无需明确指定它们。

这解释了为什么您不必指定 Accept(它是一个“简单的标头”)。您确实必须在示例中指定Content-Type,因为它既不是上述语句中引用的三种 MIME 类型。

【讨论】:

以上是关于带有发布请求的 Angular 6 标头不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Angular 4 对 asp.net 核心 API 的请求(在标头中使用授权)不起作用

带有请求标头“范围”的 .NET HttpClient 不起作用

在 Angular 6 中选择带有 RxJS 的状态不起作用

带有授权标头的 GET 请求之前的 OPTIONS 请求在苗条框架 4 中不起作用

带有 x-www-form-urlencoded 数据的 Angular 6 http 发布请求

请求中不存在“Access-Control-Allow-Origin”标头