Допустим, у меня есть простой контроллер с одним методом 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;
}
}
Если я сделаю запрос с объектом в теле, все работает нормально. Но с этой конфигурацией невозможно выполнить запрос 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
, тогда ответ выглядит так: this:
{
"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. Я не хочу читать объект из потока запросов и десериализовать его самостоятельно.