【问题标题】:.Net5 backend receives empty JSON.Net5 后端接收空 JSON
【发布时间】:2021-06-16 15:55:59
【问题描述】:

我用 .Net5 和 Angular 前端实现了一个简单的服务器。我的 api 适用于邮递员,但前提是我将 Content-Type 设置为等于 application/x-www-form-urlencoded。当我使用 Content-Type 等于 application/json 时,服务器会收到空的 json。当我使用我的前端时,我想我会向服务器发送一个应用程序/json,因为它接收的是空的。在我的代码下方。

api.service.ts

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

当我 console.log prova 它返回一个正确的 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等于0name等于null.

【问题讨论】:

  • “当我使用 Content-Type 等于 application-json 时,服务器会收到空的 json。” 这是 application/json,而不是 application-json
  • “当我 console.log 证明它返回一个正确的 Json” 这是什么意思?你的类型是Iprova。如果是 JSON,它将是一个字符串。 JSON 是一种用于数据交换的文本符号(More here.) 如果你正在处理 JavaScript/TypeScript 源代码,而不是处理 string,那么你就不是在处理 JSON。
  • 我看到你已经改变了问题,所以它现在使用application/json 而不是application-json。但是您在测试时是否真的使用了正确的值?

标签: json angular api http-post .net-5


【解决方案1】:

为简单起见,我假设您对控制器进行了基本设置,例如:

[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();
        });
    }

我会保持同样的发帖方式:

    [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 使用默认的启动设置),我还保留默认标头。在正文中,我将使用 raw 并选择 JSON 格式,给它一个简单的有效负载:

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

至于角度部分,您可以使用 httpOptions 指定请求的内容类型:

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

【讨论】:

    猜你喜欢
    • 2021-05-02
    • 2020-03-07
    • 2018-08-19
    • 2021-06-10
    • 2015-09-10
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多