Зачем мне нужен атрибут FromBody при ожидании данных в теле POST

Я могу отправлять свои данные на сервер, но только когда я использую атрибут FromBody.

почему данные json не считываются автоматически из тела с помощью Post?

Backend Web api

[HttpPost]
public async Task<IActionResult> Post([FromBody]CreateSchoolyearRequestDTO dto)
{

}

интерфейс angularjs

this.createSchoolyear = function (schoolyear) {
  var path = "/api/schoolyears";
  return $http({
      url: path,
      method: "POST",
      data:  schoolyear,
      contentType: "application/json"
  }).then(function (response) {
      return response;
  });
};

1 ответов


просто потому, что что-то является запросом POST, нет четкого правила, как передаются аргументы. Запрос POST все еще может содержать параметры запроса, закодированные в URL-адресе. Ожидается, что параметр метода будет параметром запроса для "простых" типов (строк, ints и т. д.).

обычно ожидается, что сложные типы будут объектами POST form. Стандарт ASP.NET POST request - это форма отправки, например, при входе в систему. Параметры в этом запросе обычно кодируются как application/x-www-form-urlencoded, в основном строка пар ключ / значение. Для сложных типов параметров, например, объектов модели вида формы, это считается значением по умолчанию.

для всех других нестандартных ситуаций вам нужно быть явным, откуда берется параметр метода, как он передается в запросе. Для этой цели существует ряд различных атрибутов:

  • FromBodyAttribute - для параметров, поступающих из тела запроса
  • FromFormAttribute - для параметров которые приходят от a поле данных одной формы
  • FromHeaderAttribute – для параметров из HTTP-заголовка поле
  • FromQueryAttribute - для параметров, которые исходят из аргумента запроса, закодированного в URL
  • FromRouteAttribute – для параметров, которые берутся из данных маршрута
  • FromServicesAttribute - для параметров, для которых службы должны быть введены на уровне метода