【问题标题】:Bad Request (400) for POST request to ASP.NET Core 6, minimal API, sent from Postman对 ASP.NET Core 6 的 POST 请求的错误请求 (400),最小 API,从 Postman 发送
【发布时间】:2022-01-12 21:25:05
【问题描述】:

为什么我在使用 Postman 测试 ASP.NET CORE 最小 API 应用程序时收到 400 错误请求?

默认 VS 2022 ASP.NET 核心最小 API 项目,具有以下方法处理程序:

app.MapPost("/test", (AnalizeSentenceRequest r) =>
{
    return Results.Ok($"Echo: {r.Sentence}");
});

DTO:

public class AnalizeSentenceRequest
{
    public string? Sentence { get; set; }
}

Windows 10 或 Ubuntu curls 工作正常:

> curl -X POST http://localhost:5050/test -H "Content-Type: application/json" -d "{\"sentence\":\"testing\"}"

回复:

“回声:测试”

但邮递员得到 400:

邮递员标题:

编辑:邮递员回复:

它抱怨它无法绑定到 DTO AnalizeSentenceRequest r

我尝试将 [FromBody] 属性添加到处理程序:

([FromBody] AnalizeSentenceRequest r) => ...

但没有区别。

虽然它适用于 curl...所以看起来 Postman 正在弄乱身体,但它可能是什么?

完整回复:

Microsoft.AspNetCore.Http.BadHttpRequestException: Required parameter "AnalizeSentenceRequest r" was not provided from body.
   at Microsoft.AspNetCore.Http.RequestDelegateFactory.Log.RequiredParameterNotProvided(HttpContext httpContext, String parameterTypeName, String parameterName, String source, Boolean shouldThrow)
   at lambda_method1(Closure , Object , HttpContext , Object )
   at Microsoft.AspNetCore.Http.RequestDelegateFactory.<>c__DisplayClass46_3.<<HandleRequestBodyAndCompileRequestDelegate>b__2>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

HEADERS
=======
Accept: */*
Host: localhost:5050
Content-Type: application/json

【问题讨论】:

  • 400响应的内容是什么?
  • @RomanMarusyk - 感谢您对此进行调查!我编辑了 OP 并提供了 Postman 的回复。
  • 尝试发送这个 json: {"r": {"sentence": "sometext"} }
  • @AchoVasilev - 不知道 ASP.NET Core 绑定将如何处理这个问题,但我做到了,现在邮递员的结果不同,但仍然是 400“为参数“r”推断隐式正文但没有正文已提供。您的意思是改用服务吗?但 curl 工作得很好,并根据处理程序方法主体返回......编辑:更正 Postman 400 响应,现在不同了。
  • @zizu_zaza Content-Length 标头对于具有实体主体的消息是强制性的,除非使用分块编码传输消息。需要 Content-Length 来检测服务器崩溃时过早的消息截断,并正确分割共享持久连接的消息。

标签: asp.net-core postman minimal-apis


【解决方案1】:

在 Postman 中勾选 Content-Length 复选框。原因是 Content-Length 标头对于具有实体主体的消息是强制性的,除非使用分块编码传输消息。需要 Content-Length 来检测服务器崩溃时过早的消息截断,并正确分割共享持久连接的消息。

【讨论】:

    猜你喜欢
    • 2019-06-21
    • 2022-01-04
    • 2020-10-12
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2018-10-08
    • 2020-11-15
    相关资源
    最近更新 更多