Как предоставить образец ответа в Swagger при использовании общей структуры ответа?

#asp.net-core #swagger #swashbuckle #swashbuckle.aspnetcore #swashbuckle.examples

#asp.net-ядро #swagger #swashbuckle #swashbuckle.aspnetcore #swashbuckle.examples

Вопрос:

Я использую asp.net ядро 3.1 с Swashbuckle 5.6. Я использую общий класс ApiResponse для стандартизации структуры ответов. Таким образом, для обоих кодов состояния http 404 и 500 моя структура ответа будет использовать один и тот же класс.

Но в сгенерированной документации swagger я хочу предоставить разные примеры для разных кодов ответа. Если я использую typeof(ApiResponse) либо с ProducesResponseType, либо с SwaggerResponse, в конечном итоге будет отображаться одно и то же «Примерное значение» как для кодов состояния 404, так и для 500. Я попытался предоставить образец в документации XML. Но это не входит в схему.

Структура класса ApiResponse такая же, как и в ссылке ниже. https://www.devtrends.co.uk/blog/handling-errors-in-asp.net-core-web-api

 public class ApiResponse
{
    public int StatusCode { get; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Message { get; }

    public ApiResponse(int statusCode, string message = null)
    {
        StatusCode = statusCode;
        Message = message ?? GetDefaultMessageForStatusCode(statusCode);
    }

    private static string GetDefaultMessageForStatusCode(int statusCode)
    {
        switch (statusCode)
        {
            ...
            case 404:
                return "Resource not found";
            case 500:
                return "An unhandled error occurred";
            default:
                return null;
        }
    }
}
 

И StatusCode, и Message будут отличаться для 404 и 500.

У меня есть еще одна аналогичная проблема с ответом Ok. Используя дженерики, я могу получить правильный пример для типа класса. Но для кода состояния и сообщения я не могу предоставить конкретные значения.

     public class ApiResponseOk<T> : ApiResponse
    {
        public T Result { get; }

        public ApiResponseOk()
        {

        }

        public ApiResponseOk(T result, string message = null)
            : base(200, message)
        {
            Result = resu<
        }

    }
 

Пожалуйста, дайте мне знать, как я могу предоставить отдельные примеры при использовании того же типа для ответа.

Спасибо!

Комментарии:

1. Привет @askids, не могли бы вы предоставить полный класс ApiResponse и какое свойство будет отличаться для 404 500 кодов состояния и статуса?

2. привет @DarkSideMoon, я обновил вопрос с определением класса. И StatusCode, и Message изменятся.

3. Я долго играл с вашим кодом и простым примером WebAPI. Я изменяю swagger с помощью ISchemaFilter и пытаюсь переопределить другой ответ об ошибке 404, 500 , но он изменяет ответ в swagger для обоих кодов состояния, потому что у вас есть один класс для обоих ответов ApiResponse . Я могу добавить дополнительное описание, например, на экране . Если это нормально, я могу описать решение. Но чтобы лучше решить эту ситуацию — здорово иметь разные классы , и вы можете описать разные ответы swagger .

4. Для ответов 404 и 500 я смог использовать другой Nuget, который позволяет мне приводить примеры, продолжая использовать тот же класс. Функция называется examplefilter . github.com/mattfrear/Swashbuckle . AspNetCore. Фильтры Но для ответа ok у меня все еще такая же проблема. Я даже пытался добавить пример в ApiRespose. Но это не отражается в Swagger, когда у меня есть возвращаемый тип как typeof(ApiResponseOk<MyClass>).

5. Я думаю, вам также нужно добавить ApiResponseOk<MyClass> тип в свои фильтры примеров и добавить все типы ApiResponseOk с помощью concrete MyClass , может ли это работать для swagger.