Asp Core 3 – 如何在控制器方法中允许nullable [FromBody]对象?

假设我有一个简单的控制器,它有一个POST方法,可以从它的主体中接受一个对象。然而,在HTTP请求体中,这个对象的存在应该是可选的。我尝试用下面的代码来实现这个行为

public class User
{
    public string Name { get; set; }
}

[ApiController]
[Route("[controller]")]
public class GreetingController : ControllerBase
{
    [HttpPost]
    public string SayHello([FromBody] User user = null)
    {
        return "Hello " + user?.Name;
    }
}

如果我在body中使用一个对象进行请求,一切都能正常工作,但在这个配置下,它无法使用空body进行POST请求。但是在这种配置下,它无法用空的body进行POST请求。如果我创建一个没有 Content-Type 头部(因为实际上没有内容),我得到以下错误。

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.13",
    "title": "Unsupported Media Type",
    "status": 415,
    "traceId": "|192e45d5-4bc216316f8d3966."
}

如果 Content-Type 头部有值 application/json 那么响应就会变成这样。

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|192e45d6-4bc216316f8d3966.",
    "errors": {
        "": [
            "A non-empty request body is required."
        ]
    }
}

那么,如何在请求体中使对象成为可选的?这是一个很常见的问题,我很好奇在ASP Core 3中是否有一个简单的解决方案。我不想自己从Request流中读取对象并反序列化它。

解决方案:

现在,唯一的方法是通过一个全局选项。MvcOptions.AllowEmptyInputInBodyModelBinding. 它的默认值是 false,所以你只需要做。

services.AddControllers(o =>
{
    o.AllowEmptyInputInBodyModelBinding = true;
});

给TA打赏
共{{data.count}}人
人已打赏
未分类

Python从线程中更新Matplotlib

2022-9-8 19:04:36

未分类

找到一个模式,并在它前面添加一个新行来替换该模式。

2022-9-8 19:04:38

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索