Топ за месяц!🔥
Книжки » Книги » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен 📕 - Книга онлайн бесплатно

Книга Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

17
0
На нашем литературном портале можно бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен полная версия. Жанр: Книги / Разная литература. Онлайн библиотека дает возможность прочитать весь текст произведения на мобильном телефоне или десктопе даже без регистрации и СМС подтверждения на нашем сайте онлайн книг knizki.com.

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 386 387 388 ... 407
Перейти на страницу:
class="code">protected readonly IRepo<T> MainRepo;

protected readonly IAppLogging<TController> Logger;

protected BaseCrudController(IRepo<T> repo, IAppLogging<TController> logger)

{

  MainRepo = repo;

  Logger = logger;

}

Методы GetXXX()

Есть два HTTP-метода GET, GetOne() и GetAll(). Оба они используют хранилище, переданное контроллеру. Первым делом добавьте метод Getll(), который служит в качестве конечной точки для шаблона маршрута контроллера:

/// <summary>

/// Gets all records

/// </summary>

/// <returns>All records</returns>

/// <response code="200">Returns all items</response>

[Produces("application/json")]

[ProducesResponseType(StatusCodes.Status200OK)]

[SwaggerResponse(200, "The execution was successful")]

[SwaggerResponse(400, "The request was invalid")]

[HttpGet]

public ActionResult<IEnumerable<T>> GetAll()

{

  return Ok(MainRepo.GetAllIgnoreQueryFilters());

}

Следующий метод получает одиночную запись на основе параметра id, который передается как обязательный параметр маршрута и добавляется к маршруту производного контроллера:

/// <summary>

/// Gets a single record

/// </summary>

/// <param name="id">Primary key of the record</param>

/// <returns>Single record</returns>

/// <response code="200">Found the record</response>

/// <response code="204">No content</response>

[Produces("application/json")]

[ProducesResponseType(StatusCodes.Status200OK)]

[ProducesResponseType(StatusCodes.Status204NoContent)]

[SwaggerResponse(200, "The execution was successful")]

[SwaggerResponse(204, "No content")]

[HttpGet("{id}")]

public ActionResult<T> GetOne(int id)

{

  var entity = MainRepo.Find(id);

  if (entity == null)

  {

    return NotFound();

  }

  return Ok(entity);

}

Значение маршрута автоматически присваивается параметру id (неявно из [FromRoute]).

Метод UpdateOne()

Обновление записи делается с применением HTTP-метода PUT. Ниже приведен код метода UpdateOne():

/// <summary>

/// Updates a single record

/// </summary>

/// <remarks>

/// Sample body:

/// <pre>

/// {

///   "Id": 1,

///   "TimeStamp": "AAAAAAAAB+E="

///   "MakeId": 1,

///   "Color": "Black",

///   "PetName": "Zippy",

///   "MakeColor": "VW (Black)",

/// }

/// </pre>

/// </remarks>

/// <param name="id">Primary key of the record to update</param>

/// <returns>Single record</returns>

/// <response code="200">Found and updated the record</response>

/// <response code="400">Bad request</response>

[Produces("application/json")]

[ProducesResponseType(StatusCodes.Status200OK)]

[ProducesResponseType(StatusCodes.Status400BadRequest)]

[SwaggerResponse(200, "The execution was successful")]

[SwaggerResponse(400, "The request was invalid")]

[HttpPut("{id}")]

public IActionResult UpdateOne(int id,T entity)

{

  if (id != entity.Id)

  {

    return BadRequest();

  }

  try

  {

    MainRepo.Update(entity);

  }

  catch (CustomException ex)

  {

    // Пример специального исключения.

    // Должно обрабатываться более элегантно.

    return BadRequest(ex);

  }

   catch (Exception ex)

  {

    // Должно обрабатываться более элегантно.

    return BadRequest(ex);

  }

  return Ok(entity);

}

Метод начинается с установки маршрута как запроса HttpPut на основе маршрута производного контроллера с обязательным параметром маршрута id. Значение маршрута присваивается параметру id (неявно из [FromRoute]), а сущность (entity) извлекается из тела запроса (неявно из [FromBody]).Также обратите внимание, что проверка достоверности модели отсутствует, поскольку делается автоматически атрибутом ApiController. Если состояние модели укажет на наличие ошибок, тогда клиенту будет возвращен код 400 (Bad Request).

Метод проверяет, совпадает ли значение маршрута (id) со значением id в теле запроса. Если не совпадает, то возвращается код 400 (Bad Request). Если совпадает, тогда используется хранилище для обновления записи. Если обновление терпит неудачу с генерацией исключения, то клиенту возвращается код 400 (Bad Request). Если операция обновления проходит успешно, тогда клиенту возвращается код 200 (ОК) и обновленная запись в качестве тела запроса.

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

Метод AddOne()

Вставка записи делается с применением HTTP-метода POST. Ниже приведен код метода AddOne():

/// <summary>

/// Adds a single record

/// </summary>

/// <remarks>

/// Sample body:

/// <pre>

/// {

///   "Id": 1,

///   "TimeStamp": "AAAAAAAAB+E="

///   "MakeId": 1,

///   "Color": "Black",

///   "PetName": "Zippy",

///   "MakeColor": "VW (Black)",

/// }

/// </pre>

/// </remarks>

/// <returns>Added record</returns>

/// <response code="201">Found and updated the record</response>

/// <response code="400">Bad request</response>

[Produces("application/json")]

[ProducesResponseType(StatusCodes.Status201Created)]

[ProducesResponseType(StatusCodes.Status400BadRequest)]

[SwaggerResponse(201, "The execution was successful")]

[SwaggerResponse(400, "The request was invalid")]

[HttpPost]

public ActionResult<T> AddOne(T entity)

{

  try

  {

    MainRepo.Add(entity);

  }

  catch (Exception ex)

  {

    return BadRequest(ex);

  }

  return CreatedAtAction(nameof(GetOne), new {id = entity.Id}, entity);

}

Метод начинается с определения маршрута как запроса HttpPost. Параметр маршрута отсутствует, потому что создается новая запись. Если хранилище успешно добавит запись, то ответом будет результат вызова метода CreatedAtAction(), который возвращает клиенту код 201 вместе с URL для вновь созданной сущности в виде значения заголовка Location. Вновь созданная сущность в формате JSON помещается внутрь тела ответа.

Метод DeleteOne()

Удаление записи делается с применением HTTP-метода DELETE. Ниже приведен код метода DeleteOne():

/// <summary>

/// Deletes a single record

/// </summary>

/// <remarks>

/// Sample body:

/// <pre>

/// {

///   "Id": 1,

///   "TimeStamp": "AAAAAAAAB+E="

/// }

/// </pre>

/// </remarks>

/// <returns>Nothing</returns>

/// <response code="200">Found and deleted the record</response>

/// <response code="400">Bad request</response>

[Produces("application/json")]

[ProducesResponseType(StatusCodes.Status200OK)]

[ProducesResponseType(StatusCodes.Status400BadRequest)]

[SwaggerResponse(200, "The execution was successful")]

[SwaggerResponse(400, "The request was invalid")]

[HttpDelete("{id}")]

public ActionResult<T> DeleteOne(int id, T entity)

{

  if (id != entity.Id)

  {

    return BadRequest();

  }

  try

  {

    MainRepo.Delete(entity);

  }

  catch (Exception ex)

1 ... 386 387 388 ... 407
Перейти на страницу:

Внимание!

Сайт сохраняет куки вашего браузера. Вы сможете в любой момент сделать закладку и продолжить прочтение книги «Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен», после закрытия браузера.

Комментарии и отзывы (0) к книге "Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен"