Хобрук: Ваш путь к мастерству в программировании

Конечная точка .NET Core 2 не привязывает параметры FromBody к POST

Я делаю следующий вызов в своем приложении Angular.

this._client.post(
  "http://localhost:4300/api/Beep",
  { name: name, email: email })
  .subscribe(...);

Я также пробовал с явной конфигурацией заголовка.

this._client.post(
  "http://localhost:4300/api/Beep",
  { name: name, email: email }),
  { headers: new HttpHeaders({ "Content-Type": "application/json" }) }
  .subscribe(...);

Точка останова перехватывается следующим методом.

[HttpPost("Beep")]
public IActionResult RequestNetwork(
  [FromBody]string name, 
  [FromBody]string email)
{
  ...
  return Ok();
}

Проблема в том, что оба поля пусты.

Я не совсем уверен, делаю ли я что-то глупое в вызове на стороне интерфейса или на стороне сервера. Я сверил код с блогами, такими как этот . Я делаю ставку на первое, потому что я следовал документам Angular и, также я запустил Postman (установив для Content-Type значение application/json и отправив {name:"qqq",email:"www"} в сыром виде). Тот же результат для каждой комбинации параметров, которые я пробовал.

Исходя из этого предположения, я искал в Google все, что напоминает «связывание основного сообщения из тела», включая варианты, которые я мог придумать. Я не нашел ничего, что я бы признал связанным или полезным (возможно, из-за отсутствия опыта или разочарования).

В чем может быть проблема и что я должен искать конкретно, чтобы решить ее (или, по крайней мере, углубиться в любую ошибку, на которой я застрял)?


  • Я думаю, что это [HttpPost, ActionName (Beep)], но я не знаю, нужно ли вам использовать класс 29.04.2018
  • Атрибут FromBody можно использовать только один раз в списке параметров конечной точки. Дополнительная информация здесь: docs.microsoft.com/en-us/aspnet/web-api/overview/ 29.04.2018
  • @R.Richards Эта информация относится к 2013 году и относится к старой версии .NET. Вы уверены, что он актуален и сегодня? Если да, то как мне подходить к отправке нескольких значений (к счастью, только строки и int, без сложных структур)? Я заметил, что могу использовать динамические данные [FromBody], а затем data.name или data.email, но я предпочитаю использовать фактические типы. Можете ли вы предложить другой FromXxx для отправки нескольких значений по POST? 29.04.2018
  • @Элизео Нет, это не так. Или, скорее, это так, но я уже подхожу к действию, так как точка останова сработала. Я пытаюсь выяснить привязку данных, а не таргетинг конечной точки. Или я неправильно понял вашу мысль? 29.04.2018
  • Извините, я использую мета, как я его опубликовал, и использую класс, а не два [FromBody], и работаю на меня. У меня не так много опыта, чтобы сделать что-то другое. 29.04.2018
  • @DonkeyBanana Прости!! Я не смотрел на дату на странице, когда добавлял эту ссылку. Это все еще применяется сегодня. См. здесь. Так всегда было с атрибутом FromBody. Похоже, вы получили свой ответ. Рад, что ты понял это. 29.04.2018

Ответы:


1

попробуйте использовать класс

public class DataType
{
   public string name { get; set; }
   public string email { get; set; }
}

//in your api
[HttpPost, ActionName("Beep")]
public IActionResult RequestNetwork([FromBody]DataType value)
{
  string name=value.name;
  string email=value.email;
  ...
  return Ok();
}
28.04.2018
  • Прежде всего: +1 за аккуратное форматирование. Это единственный способ? Я бы предпочел изменить предоставленные данные, просто изменив подпись конечной точки без перепроектирования модели. Может я просто не привык к такому подходу? Я ожидал, что отличный .NET Core будет таким же удобным, как возможность каким-то образом связать отдельные поля с входными параметрами. К сожалению, я ошибся? 29.04.2018
  • См. stackoverflow.com/questions/49558987/ (вы можете использовать динамические или параметры в URL-адресе 29.04.2018
  • @Eliseo: это как бы превосходит идею сильного типизированного языка. 29.04.2018
  • Да, я ненавижу динамику, но это только личное мнение 29.04.2018
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..