.Net5 后端收到空 JSON

.Net5 backend receives empty JSON

我用 .Net5 和 Angular 前端实现了一个简单的服务器。我的 api 与 post man 一起工作,但前提是我将 Content-Type 设置为 application/x-www-form-urlencoded。当我使用等于 application/json 的 Content-Type 时,服务器收到空 json。当我使用我的前端时,我想我向服务器发送了一个 application/json 因为它收到了一个空的。在我的代码下面。

api.service.ts

    public createProva(prova:Iprova): Observable<Iprova> {
        return this.http.post<Iprova>( this.Url, prova );
    }

当我console.logprova它return一个正确的Json

controller.cs

        [HttpPost]
        [Route("url")]
        public async Task<IActionResult> postProva(provaDto s)
        {
            porvaModel prova = new provaModel
            {
                Id = s.id,
                Name = s.name
            };

            _context.provaModel.Add(prova);
            await _context.SaveChangesAsync();
            return CreatedAtAction(nameof(getProva), new { id = prova.Id }, prova);
        }

但是当后端接收到 provaDto 时,s 为空,id 等于 0 并且name 等于 null.

为简单起见,我假设您的控制器具有如下基本设置:

[ApiController]
[Route("[controller]")]
public class ProvaController : ControllerBase

出于开发目的,我还在 startup.cs 中禁用了 https 重定向,同时保留了默认路由功能。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {     
        if (!env.IsDevelopment())
        {
            app.UseHttpsRedirection();
        }

        app.UseRouting();            

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

我将保持相同的post方法:

    [HttpPost]
    
    public async Task<IActionResult> postProva(provaDto s)
    {
        porvaModel prova = new provaModel
        {
            Id = s.id,
            Name = s.name
        };

        _context.provaModel.Add(prova);
        await _context.SaveChangesAsync();
        return CreatedAtAction(nameof(getProva), new { id = prova.Id }, prova);
    }

至于 Postman 设置,我在 http://localhost:5000/Prova 上使用 POST 请求(我使用 dotnet CLI 使用默认的 launchSettings),我也保持默认 headers .在 Body 中,我将使用原始格式和 select JSON 格式,为其提供一个简单的负载:

{
"id": 0,
"name": "string"
}

至于 angular 部分,您可以使用 httpOptions 指定请求的 content-type :

httpOptions = {
  headers: new HttpHeaders({
    'Content-Type': 'application/json',
  })
};
public createProva(prova:Iprova): Observable<Iprova> {
    return this.http.post<Iprova>( this.Url, prova , this.httpOptions);
}