using Swashbuckle.AspNetCore.Annotations;
Атрибут
Produces
задает тип содержимого для конечной точки. Атрибут
ProducesResponseType
использует перечисление
StatusCodes
для указания возможного кода возврата для конечной точки. Модифицируйте метод
Get()
класса
ValuesController
, чтобы установить
application/json
в качестве возвращаемого типа и сообщить о том, что результатом действия будет либо 200 (ОК), либо 400 (Bad Request):
[HttpGet]
<b>[Produces("application/json")]</b>
<b>[ProducesResponseType(StatusCodes.Status200OK)]</b>
<b>[ProducesResponseType(StatusCodes.Status400BadRequest)]</b>
public ActionResult<IEnumerable<string>> Get()
{
return new string[] {"value1", "value2"};
}
Хотя атрибут
ProducesResponseType
добавляет в документацию коды ответов, настроить эту информацию невозможно. К счастью, Swashbuckle добавляет атрибут
SwaggerResponse
, предназначенный как раз для такой цели. Приведите код метода
Get()
к следующему виду:
[HttpGet]
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
<b>[SwaggerResponse(200, "The execution was successful")]</b>
<b>[SwaggerResponse(400, "The request was invalid")]</b>
public ActionResult<IEnumerable<string>> Get()
{
return new string[] {"value1", "value2"};
}
Прежде чем аннотации Swagger будут приняты и добавлены в сгенерированную документацию, их потребуется включить. Откройте файл
Startup.cs
и перейдите к методу
Configure()
. Обновите вызов
AddSwaggerGen()
, как показано ниже:
services.AddSwaggerGen(c =>
{
<b> c.EnableAnnotations();</b>
...
});
Теперь, просматривая раздел ответов в пользовательском интерфейсе Swagger, вы будете видеть настроенный обмен сообщениями (рис. 30.5).
На заметку! В Swashbuckle поддерживается большой объем дополнительной настройки, за сведениями о которой обращайтесь в документацию по ссылке
https://github.com/domaindrivendev/Swashbuckle.AspNetCore
.
Построение методов действий API
Большинство функциональных средств приложения
AutoLot.Api
можно отнести к одному из перечисленных далее методов:
•
GetOne()
•
GetAll()
•
UpdateOne()
•
AddOnе()
•
DeleteOne()
Основные методы API будут реализованы в обобщенном базовом контроллере API. Начните с создания нового каталога под названием
Base
в каталоге
Controllers
проекта
AutoLot.Api
. Добавьте в этот каталог новый файл класса по имени
BaseCrudController.cs
. Модифицируйте операторы
using
и определение класса, как демонстрируется ниже:
using System;
using System.Collections.Generic;
using AutoLot.Dal.Exceptions;
using AutoLot.Models.Entities.Base;
using AutoLot.Dal.Repos.Base;
using AutoLot.Services.Logging;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
namespace AutoLot.Api.Controllers.Base
{
[ApiController]
public abstract class BaseCrudController<T, TController> : ControllerBase
where T : BaseEntity, new()
where TController : BaseCrudController<T, TController>
{
}
}
Класс является открытым и абстрактным, а также унаследованным от
ControllerBase
. Он принимает два обобщенных параметра типа. Первый тип ограничивается так, чтобы быть производным от
BaseEntity
и иметь стандартный конструктор, а второй — быть производным от
BaseCrudController
(для представления производных контроллеров). Когда к базовому классу добавляется атрибут
ApiController
, производные контроллеры получают функциональность, обеспечиваемую атрибутом.
На заметку! Для этого класса не определен маршрут. Он будет установлен с использованием производных классов.
Конструктор
На следующем шаге добавляются две защищенные переменные уровня класса: одна для хранения реализации интерфейса
IRepo<T>
и еще одна для хранения реализации интерфейса
IAppLogging<T>
. Обе они должны устанавливаться с применением конструктора.