Angular 2 http.post 不适用于 web api

Posted

技术标签:

【中文标题】Angular 2 http.post 不适用于 web api【英文标题】:Angular 2 http.post not working with web api 【发布时间】:2017-11-10 18:42:45 【问题描述】:

我的 Web Api 核心控制器方法是这样的

public void Post(Sample sample) 
         _sampleService.CreateSample(sample);
    

示例 POCO 看起来像这样

  public class Sample : BaseEntity

    public string BarCode  get; set; 
    public DateTime CreatedAt  get; set; 
    public virtual User CreatedBy  get; set; 
    public virtual Status Status  get; set; 

客户端示例对象目前仅发送 2 个属性,如下所示。

barcode:"1234"createdAt:"2017-06-07"

http 帖子看起来像这样

createSample(sample: Sample) 
let headers = new Headers();
headers.append('Content-Type', 'application/json');
return this.http.post(AppConstants.createSample, JSON.stringify(sample),  headers: headers )
  .map((res: Response) => res.json());  

所以如果我使用标题,我会得到 No 'Access-Control-Allow-Origin' header is present

如果我不使用标题,我会得到(不支持的媒体类型)

知道这里发生了什么。 更新 所以我按照第一个答案中的说明进行操作,看起来 CORS 未设置属性,但现在 JSON 未转换为 C# 对象

【问题讨论】:

看起来是 CORS 问题。 不是 CORS 问题,其余调用正常。 CORS 已全局启用 【参考方案1】:

    您需要使用标头告诉 API 方法您要发送什么。

    您需要在您的 .Net Core 应用程序Startup.cs 中启用 CORS,以便您的 API 允许来自其他来源的请求(基本上接受来自您的客户端应用程序 url 的调用) - 并将 CORS 设置为 AllowAnyMethod ()

您可以在 ConfigureServices() 方法中使用以下代码:

var corsUrls = new List<string>()"http://localhost:4200", "https://mylivesite.com";

services.AddCors(o => o.AddPolicy("CorsPolicy", builder =>

    builder
      .AllowAnyMethod() //<--this allows preflight headers required for POST
      .AllowAnyHeader() //<--accepts headers 
      .AllowCredentials() //<--lets your app send auth credentials
      .WithOrigins(corsUrls.ToArray()); //<--this is the important line
));

services.Configure<MvcOptions>(
    options =>  options.Filters.Add(new CorsAuthorizationFilterFactory("CorsPolicy")); );

最后在你的Configure() 方法中:

app.UseCors("CorsPolicy");

请注意,我使用的策略名称"CorsPolicy" 只是一个示例,您可以随意命名。

【讨论】:

几分钟后试试这个 这是您的客户端和服务器之间的映射问题 - 我猜这是因为您的案例不匹配并且您在调用 services.AddMvc(...) mvcBuilder.AddJsonOptions( x =&gt; x.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver()); 作为它的 mvc 核心,所以我尝试了 services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver()) 但看起来只是在 post 方法中添加 [FromBody]它可以工作,但只能通过 Angular 应用程序中的 PostMan 它仍然为空。如果我使用动态或 JObject 效果很好 可能与数据类型有关。从部分 JSON 对象到 POCO 的转换可能无效 - 尝试创建一个更简单的类(字符串类型属性最容易开始)并使用它 - 如果它有效,则一次更改一个属性类型,直到它停止工作 - 然后你知道问题出在哪里。 所以问题是如果我的打字稿对象包含日期它在服务器端变为空。例如,我在 POCO 中有 datetimr 属性,并且在我的 typescript 对象中有 createdAt: Date ,它不起作用

以上是关于Angular 2 http.post 不适用于 web api的主要内容,如果未能解决你的问题,请参考以下文章

JWT 身份验证适用于 $http.get 但不适用于 $http.post

angular 2 [innerHTML] 在 html 内渲染(不适用于 angular 2)[重复]

Python Flask 跨站点 HTTP POST - 不适用于特定允许的来源

Boostrap 4 Modal 不适用于 Angular 2

表单验证不适用于 Ionic 2 中的 Angular 2 FormBuilder

HTTP POST 请求适用于 Postman,但不适用于我的 Web 应用程序的 JavaScript 提取 [关闭]