Включить формат в swagger, сгенерированный из веб-API С#

Мне дали образец определения чванства и попросили создать соответствующий веб-API. (У меня нет разрешений на создание API из SwaggerHub, так что это не вариант). Мне нужно, чтобы мой веб-API генерировал документы Swagger как можно ближе к оригиналу.

Существующий документ Swagger включает определения схемы, включающие такие свойства:

titleOrderId    string($uuid)
                id of the title order - not a file number
orderDate       string($date-time)
documentCount   string($int32)

В YAML я вижу следующее:

Я создал те же объекты/свойства в С#, но они создают следующие схемы Swagger:

titleOrderId    string
orderDate       string
documentCount   string

Есть ли способ указать format и description в моем коде С#, чтобы я мог создавать один и тот же вывод Swagger?

Я работаю в ASP.Net Core 6.0.

Я понятия не имею, почему documentCount является строкой. Изменение типов свойств, как вы предложили, действительно помогло. Однако documentCount отображается как целое число ($ int32) вместо строки ($ int32). В любом случае, если вы опубликуете свой ответ, я приму его как ответ. Спасибо

RHarris 20.12.2022 14:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В спецификации OpenAPI нет такой вещи, как string($int32). Это должно быть либо string, если это действительно строка (независимо от того, отформатирована ли она как int), либо должно быть integer($int32), если это целое число.

Два других фиксируются следующим образом:

public class OrderItem
{
    public Guid TitleOrderId { get; set; }
    public DateTime OrderDate { get; set; }
    public int DocumentCount { get; set; } // or change to string if it should be a string
}

ОБНОВЛЯТЬ

Чтобы добавить описание, вам необходимо установить Swashbuckle.AspNetCore.Annotations NuGet Package.

Затем включите аннотации в Startup.cs:

services.AddSwaggerGen(c =>
{
   ...

   c.EnableAnnotations();
});

Затем вы добавляете описание, используя атрибут SwaggerSchema. Вы также можете установить DocumentCount на string и добавить параметр формата int32. Это нарушит спецификацию OpenAPI, но будет делать то, что вы хотите:

public class OrderItem
{
    [SwaggerSchema("id of the title order - not a file number")]
    public Guid TitleOrderId { get; set; }

    public DateTime OrderDate { get; set; }

    [SwaggerSchema(Format = "int32")]
    public string DocumentCount { get; set; }
}

Вы также можете сделать это так, если очень хотите, но я бы рекомендовал оставить типы Guid и DateTime:

public class OrderItem
{
    [SwaggerSchema("id of the title order - not a file number", Format = "uuid")]
    public string TitleOrderId { get; set; }

    [SwaggerSchema(Format = "date-time")]
    public string OrderDate { get; set; }

    [SwaggerSchema(Format = "int32")]
    public string DocumentCount { get; set; }
}

Любая идея, как получить дополнительное описание для отображения? Я попытался добавить краткий комментарий к своим свойствам, но, похоже, это не сработало.

RHarris 20.12.2022 14:49

Я ценю вашу помощь. У меня есть еще один вопрос. Я только что наткнулся на другую схему, подобную этой: startDate string($date). Использование DateTime приводит к startDate string($date-time). Есть ли эквивалент Date в С#?

RHarris 20.12.2022 15:48

@RHarris есть класс DateOnly, но он не будет правильно сериализовать/десериализовать в JSON и не будет предоставлять правильные аннотации схемы. Я бы предложил использовать тип DateTime и [SwaggerSchema(Format = "date")].

theemee 20.12.2022 15:56

Другие вопросы по теме