Разработка веб-API!
О, смотрите, кто вернулся. Надеюсь, вы уже являетесь подписчиком, потому что если нет… вы выглядите как сталкер…
Добро пожаловать в следующую часть нашей серии статей. Господи, часть двенадцатая, мне нужно связаться с Нетфликс и поработать с ними. Упоминая Netflix, кстати, вы смотрели новый сезон Ведьмака? Феноменальный! Я просто обожаю такие шоу. Если вы знаете что-то, что я должен попробовать, напишите мне в комментариях.
Давайте приступим к делу.
Сегодня мы добавим оружие в наш OrcTheGood.
DTO
namespace WebApplication2.DTOs { public record struct WeaponCreateDTO(string Name); }
Во-первых, мы хотим определить объект WeaponCreateDTO
, который мы будем использовать так же, как мы использовали другие.
Поскольку мы создадим нашего персонажа с некоторым набором оружия (он может держать их несколько), мы также хотим изменить CharacterCreateDTO
.
namespace WebApplication2.DTOs { public record struct CharacterCreateDTO(string Name, BackpackCreateDTO Backpack, List<WeaponCreateDTO> Weapons); }
Я добавил список оружия в этом классе. Когда мы создаем персонажа, у нас должна быть возможность назначить ему оружие.
Контроллер
Теперь пришло время изменить наш MediumController
, который является контроллером, отвечающим за наш текущий API персонажей.
Вот две строки, которые я добавил.
var weapons = request.Weapons.Select(w => new Weapon { Name = w.Name, Character = newCharacter }).ToList();
Используя запрос, как CharacterCreateDTO
, поскольку он был изменен, у нас есть возможность коснуться там Weapons
сегмента. Оттуда мы будем перебирать каждый элемент и создадим новый Weapon
. Теперь, поскольку Weapon
должен быть связан с конкретным Character
, конечно, этот символ у нас уже есть выше, поэтому мы поместим его в качестве ссылки.
После этого мы должны сказать, что текущий набор оружия этого персонажа будет равен оружию, которое мы только что произвели.
Это потому, что у каждого персонажа есть список оружия внутри него.
Наконец, нам нужно вернуть все, включая оружие и рюкзаки. По этой причине мы также изменили последнюю строку.
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using WebApplication2.Data; using WebApplication2.Data.Models; using WebApplication2.DTOs; namespace WebApplication2.Controllers { [Route("api/[controller]")] [ApiController] public class MediumController : ControllerBase { private readonly DataContext _dataContext; public MediumController(DataContext context) { _dataContext = context; } [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 }; var weapons = request.Weapons.Select(w => new Weapon { Name = w.Name, Character = newCharacter }).ToList(); newCharacter.Backpack = backpack; newCharacter.Weapons = weapons; _dataContext.Characters.Add(newCharacter); await _dataContext.SaveChangesAsync(); return Ok(await _dataContext.Characters.Include(c => c.Backpack).Include(c => c.Weapons).ToListAsync()); } } }
Вот полный код контроллера.
Время тестирования
Тестирование этого дает мне ту же ошибку, что и раньше.
Вот почему нам нужно изменить нашу сущность Weapon
следующим образом, как мы это делали раньше.
с атрибутом JsonIgnore
.
using System.Text.Json.Serialization; namespace WebApplication2.Data.Models { public class Weapon { public int Id { get; set; } public string Name { get; set; } public int CharacterId { get; set; } [JsonIgnore] public Character Character { get; set; } } }
Давайте попробуем еще раз.
Это будет мой тестовый JSON.
{ "name": "OrcTheGood", "backpack": { "description": "a Good orc" }, "weapons": [ { "name": "Sword" }, { "name": "Arrow" } ] }
И вот мы идем.
Мы только что дали OrcTheGood меч и стрелу. Что он будет с ней делать без лука… Не знаю!
Я надеюсь, что вы нашли эту статью полезной, и в следующей мы также добавим фракции. Спасибо, что вы со мной! Пока!