#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
с помощью concreteMyClass
, может ли это работать для swagger.