Разработка HTTP-методов

В предыдущей статье мы рассмотрели DTO и данные, которые будем использовать далее в серии статей. Если вы еще не проверили это, я советую вам посмотреть это здесь:



Сегодня мы создадим методы для окончательного создания вещей и размещения их в нашей базе данных.

Вы меня уже знаете, я люблю сразу переходить к делу, так что расположите свою попку в удобном положении и давайте приступим!

Контроллер

Мы уже создали контроллер в Части 10 из нашей серии. Здесь мы, конечно, расширим его.

Сначала я хочу создать Characterс Backpack, что, конечно же, как вы помните, будет типом отношений 1:1.

Почтовый метод

Итак, самое сложное в нашей серии. Как мы будем писать метод, который будет брать параметры у клиента и формировать запрос?

Кроме того, нам нужно подумать о том, как мы собираемся использовать данные запроса, чтобы сформулировать то, что нам нужно.

Вот метод POST, который я создал.

        [HttpPost]
        public async Task<ActionResult<Character>> CreateCharacter(CharacterCreateDTO request)
        {
            var newCharacter = new Character
            {
                Name = request.Name
            };

            var backpack = new Backpack { Description = request.Backpack.Description, Character = newCharacter };

            newCharacter.Backpack = backpack;

            _dataContext.Characters.Add(newCharacter);

            await _dataContext.SaveChangesAsync();

            return Ok(await _dataContext.Characters.Include(c => c.Backpack).ToListAsync());
        }

Разберем код шаг за шагом:

  1. var newCharacter = new Character { Name = request.Name };
  2. Эта строка создает новый экземпляр класса «Character» и присваивает свойство «Name» из объекта «request». Объект request, скорее всего, содержит данные, отправленные клиентом, например, через HTTP-запрос. Эта строка по существу создает нового персонажа с заданным именем.
  3. var backpack = new Backpack { Description = request.Backpack.Description, Character = newCharacter };
  4. Здесь создается новый экземпляр «Рюкзак», и его свойство «Описание» задается с помощью свойства «Описание» из объекта «request.Backpack». Кроме того, свойство «Character» для «Backpack» задается для объекта «newCharacter», созданного на предыдущем шаге. Это устанавливает связь между персонажем и его рюкзаком.
  5. newCharacter.Backpack = backpack;
  6. Эта строка задает для свойства Backpack объекта newCharacter объект backpack, созданный на предыдущем шаге. Это также эффективно связывает рюкзак с персонажем, завершая двунаправленную ассоциацию.
  7. _dataContext.Characters.Add(newCharacter);
  8. Предполагая, что «_dataContext» является контекстом базы данных или репозиторием, эта строка добавляет сущность «newCharacter» в коллекцию «Characters» контекста данных. На этом этапе персонаж и связанный с ним рюкзак готовятся к сохранению в базе данных.
  9. await _dataContext.SaveChangesAsync();
  10. Эта строка сохраняет изменения, внесенные в контекст данных, в базу данных. Метод SaveChangesAsync — это асинхронная операция, поэтому он ожидает завершения операции с базой данных.
  11. return Ok(await _dataContext.Characters.Include(c => c.Backpack).ToListAsync());
  12. После сохранения нового персонажа и рюкзака эта строка извлекает список персонажей из базы данных, включая связанные с ними рюкзаки. Метод «Включить» используется для быстрой загрузки свойства «Рюкзак» каждого персонажа, поэтому ответ будет содержать список персонажей, каждый со своим рюкзаком. Метод Ok используется для возврата кода состояния HTTP 200 вместе с сериализованным списком символов в качестве ответа API.

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

Время тестирования

Пришло время протестировать то, что у нас есть. Давайте запустим приложение и посмотрим, что нас встречает в SwaggerUI.

И я вижу проблему.

У меня ошибка: «Обнаружен возможный объектный цикл».

Сообщение об ошибке обычно появляется в контексте программирования, особенно в языках, поддерживающих сборку мусора или управление памятью. Эта ошибка указывает на то, что между объектами может быть циклическая ссылка или зависимость, что может привести к утечке памяти или неожиданному поведению.

Один из способов исправить это — перейти к Backpack.cs и поместить атрибут JsonIgnore, вот так.

Поскольку у Backpack есть Character, а у Character есть Backpack, а у Backpack естьCharacter… Да, это то, что видит компьютер, когда выполняет запрос.

В C# атрибут JsonIgnore используется для указания того, что определенное свойство следует игнорировать в процессах сериализации и десериализации JSON. Если у вас есть объект, который вы хотите преобразовать в JSON или наоборот (JSON в объект), атрибут JsonIgnore гарантирует, что отмеченное свойство не будет включено в данные JSON или проигнорировано во время десериализации.

Вот что получилось после этого исправления.

У нас есть MediumTest вдоль OrcTheGood дважды, но мы посмотрим, почему это происходит позже.

Ну вот! Для этого мы написали наш первый метод POST. Хороший! В следующей статье мы продолжим отсюда и создадим GET, а также исправим пару проблем и продолжим изучение взаимосвязей.

Спасибо, что были со мной, и увидимся в следующем! Пока!