Упражнение. Настройка и расширение документации OpenAPI с помощью заметок и комментариев XML
В этом упражнении вы обогатите документацию, которую разработчик видит о API, добавив комментарии и заметки в код. Сначала необходимо посмотреть значения получаемые по умолчанию от Swagger UI.
Чтобы проверить определение OpenAPI конечной точки API в пользовательском интерфейсе Swagger, перейдите в браузере к
http://localhost:5000/swagger
. При выборе метода Get должны отобразиться выходные данные, как показано ниже.Swagger UI предоставляет некоторую полезную информацию об API. Он отображает методы, которые можно вызвать (в нашем простом примере один из методов называется PriceFrame). Вы можете увидеть, что это операция HTTP Get, которая принимает два обязательных параметра с именем Height и Width. Чтобы увидеть вызов API в действии, можно выбрать "Попробовать", ввести значения высоты и ширины и выбрать "Выполнить".
Пользователи API по-прежнему не имеют достаточно информации, чтобы знать ограничения метода PriceFrame . Предоставим им дополнительную информацию с помощью комментариев XML.
Добавление комментариев XML к API
Вернитесь к экземпляру Visual Studio Code, который использовался в последнем упражнении.
Если веб-API по-прежнему работает в последнем упражнении, нажмите клавиши CTRL+C в Windows или cmd+c на Mac, чтобы остановить его.
Чтобы запустить документацию XML в проекте, обновите файл проекта PrintFramerAPI.csproj, добавьте тег
GenerateDocumentationFile
в существующую группу<PropertyGroup>
и задайте для него значениеtrue
.<PropertyGroup> <TargetFramework>net7.0</TargetFramework> <GenerateDocumentationFile>true</GenerateDocumentationFile> <NoWarn>$(NoWarn);1591</NoWarn> </PropertyGroup>
Используйте инструкции и добавьте в файл Startup.cs следующее.
using System.Reflection; using System.IO;
В Startup.cs сообщите Swashbuckle использовать XML-документацию, обновив вызов в
AddSwaggerGen()
ConfigureServices
.public void ConfigureServices(IServiceCollection services) { services.AddControllers(); // Register the Swagger generator, defining 1 or more Swagger documents services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "PrintFramer API", Description = "Calculates the cost of a picture frame based on its dimensions.", TermsOfService = new Uri("https://go.microsoft.com/fwlink/?LinkID=206977"), Contact = new OpenApiContact { Name = "Your name", Email = string.Empty, Url = new Uri("https://learn.microsoft.com/training") } }); // Set the comments path for the Swagger JSON and UI. var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath); }); }
Чтобы определить имя файла XML для загрузки комментариев XML, в предыдущем коде используется отражение.
В папке "Контроллеры" откройте PriceFrameController.cs. Добавьте следующий блок комментариев XML над атрибутом
GetPrice
HttpGet метода. Добавление комментариев с тройной косой чертой к действию улучшает Swagger UI. Это добавляет описание в заголовок раздела./// <summary> /// Returns the price of a frame based on its dimensions. /// </summary> /// <param name="Height">The height of the frame.</param> /// <param name="Width">The width of the frame.</param> /// <returns>The price, in dollars, of the picture frame.</returns> /// <remarks> The API returns 'not valid' if the total length of frame material needed (the perimeter of the frame) is less than 20 inches and greater than 1000 inches.</remarks> [HttpGet("{Height}/{Width}")] public string GetPrice(string Height, string Width) { string result; result = CalculatePrice(Double.Parse(Height), Double.Parse(Width)); return $"The cost of a {Height}x{Width} frame is ${result}"; }
Чтобы сохранить все изменения и убедиться, что они создаются локально, запустите в окне терминала Visual Studio Code следующую команду.
dotnet build
Чтобы просмотреть изменения, запустите приложение ASP.NET локально, введя в окне терминала Visual Studio Code следующие сведения:
dotnet run
Снова просмотрите пользовательский интерфейс Swagger
http://localhost:5000/swagger
, а затем ознакомьтесь со сведениями, добавленными в комментариях XML к документации OpenAPI.
Добавление аннотации данных в API
Чтобы в Swagger можно было улучшать документацию OpenAPI, используйте атрибуты из пространства имен Microsoft.AspNetCore.Mvc
.
Если веб-API по-прежнему работает в последнем упражнении, нажмите клавиши CTRL+C в Windows или cmd+c на Mac, чтобы остановить его.
В контроллер API PriceFrameController.cs необходимо добавить атрибут
[Produces("text/plain")]
над определениемGetPrice
. Он отображает сведения о том, что APIGetPrice
поддерживает тип содержимого ответа для text/plain.[HttpGet("{Height}/{Width}")] [Produces("text/plain")]
Этот тип содержимого выбирается в раскрывающемся списке в качестве значения по умолчанию для операций контроллера GET.
Добавление аннотаций Swashbuckle в API
До сих пор API возвращает код состояния 200, когда он может вычислить цену для заданных измерений кадра. В описании GetPrice
метода обратите внимание на случай, когда цена не может быть рассчитана.
Более надежным способом сообщить разработчикам типы ответов и коды ошибок являются следующие комментарии XML и аннотации данных. Средства Swashbuckle и Swagger используют эти значения, чтобы четко создать описание ожидаемых кодов http-ответов OpenAPI.
Также обновите конструктор фильтра глаголов HTTP, чтобы включить Name
свойство и включить значение OpenAPI operationId
.
Добавьте следующую инструкцию using в файл PriceFrameController.cs .
using Microsoft.AspNetCore.Http;
В PriceFrameController.cs замените
GetPrice
приведенный ниже код и комментарий./// <summary> /// Returns the price of a frame based on its dimensions. /// </summary> /// <param name="Height">The height of the frame.</param> /// <param name="Width">The width of the frame.</param> /// <returns>The price, in dollars, of the picture frame.</returns> /// <remarks> /// Sample request: /// /// Get /api/priceframe/5/10 /// /// </remarks> /// <response code="200">Returns the cost of the frame in dollars.</response> /// <response code="400">If the amount of frame material needed is less than 20 inches or greater than 1000 inches.</response> [HttpGet("{Height}/{Width}", Name=nameof(GetPrice))] [Produces("text/plain")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public ActionResult<string> GetPrice(string Height, string Width) { string result; result = CalculatePrice(Double.Parse(Height), Double.Parse(Width)); if (result == "not valid") { return BadRequest(result); } else { return Ok($"The cost of a {Height}x{Width} frame is ${result}"); } }
После обновления кода будут выполнены следующие изменения.
- Методы
BadRequest()
иOk()
используются для создания соответственно статусов BadRequest (400) и ОК, передавая результаты ответа в строку. - Комментарии XML описывают каждый код состояния, который может возвращать этот метод.
- Атрибут HttpGet содержит
Name
свойство для выдачи параметра OpenAPIoperationId
. - Атрибуты ProducesResponseType перечисляют различные ответы, которые может возвращать действие. Как описано выше, эти атрибуты объединяются с комментариями XML, чтобы добавить описания, удобные для человека, к каждому ответу в сгенерированном Swagger.
- Методы
Перестройте веб-API с помощью следующей команды:
dotnet build
Запустите приложение ASP.NET с помощью следующей команды:
dotnet run
Снова просмотрите пользовательский интерфейс Swagger
http://localhost:5000/swagger
и ознакомьтесь со сведениями, полученными из этих заметок. Окончательный Swagger UI для API представлен на следующем рисунке.
В этом упражнении вы обогатили сведения, получаемые разработчиком о API, что упрощает использование.