Objetos anidados en el ejemplo generado automáticamente por Swashbuckle.
Tengo una API .NET Core que está documentada mediante Swashbuckle y Swagger. El “ejemplo” que se genera para la interfaz de usuario parece no incluir objetos anidados en la solicitud adecuadamente, aunque se manejan y procesan correctamente al ejecutar los endpoints.
Tengo una clase CreatePaymentRequest, que se recibe del cuerpo de la solicitud HTTP y que contiene una propiedad de tipo Notional. Notional se compone de un valor decimal y un valor de cadena.
El ejemplo generado se ve así:
{
“tradeId”: 0,
“settlementMeans”: “SWIFT”,
“notional1”: {},
“notional1Rate”: 0,
“notional2”: {},
“notional2Rate”: 0,
“paymentReference”: “string”,
“description”: “string”
}
Cuando esperaría que se viera así:
{
“tradeId”: 0,
“settlementMeans”: “SWIFT”,
“notional1”: {“Amount”: 0, “Currency”: “string”},
“notional1Rate”: 0,
“notional2”: {“Amount”: 0, “Currency”: “string”},
“notional2Rate”: 0,
“paymentReference”: “string”,
“description”: “string”
}
El esquema generado también parece estar incorrecto, ya que no incluye las propiedades de Notional.
Aunque se muestra correctamente en la sección “Esquemas” en la parte inferior.
Aquí están las clases que conforman cada objeto:
public class Request
{
public long TradeId { get; set; }
public SettlementMeans SettlementMeans { get; set; }
public Notional Notional1 { get; set; }
public decimal Notional1Rate { get; set; }
public Notional Notional2 { get; set; }
public decimal Notional2Rate { get; set; }
public string PaymentReference { get; set; } = “”;
public string Description { get; set; } = “”;
}
public class Notional
{
[JsonContructor]
public Notional(decimal amount, string currency)
{
Amount = amount;
Currency = currency;
}
public Notional()
{
Amount = 0;
Currency = "XXX";
}
public decimal Amount { get; }
public string Currency { get; }
}
Método controlador:
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(CreatePaymentApi_Response))]
[ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(BadRequestResponse))]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<>
{
var command = _mapper.Map<createpaymenthandler.request>(request);
var response = await _mediator.Send(command);
var result = _mapper.Map<createpaymenthandler.response>(response);
return Ok(result);
}
Estoy configurando SwaggerGen utilizando services.AddSwaggerGen(); en ConfigureServices sin ninguna opción especial.
Tener que escribir constantemente o copiar/pegar el JSON para los valores Notional se está volviendo muy repetitivo al depurar a través de la interfaz de usuario de Swashbuckle. ¿Hay algo que pueda hacer para que el ejemplo se genere como se espera?</createpaymenthandler.response></createpaymenthandler.request>
davy.ai
Problema con Swagger y Swashbuckle al no generar correctamente objetos anidados en el ejemplo de solicitud para una API de .NET Core
Descripción del problema
El ejemplo generado para la interfaz de usuario en Swagger y Swashbuckle para una API de .NET Core no parece incluir objetos anidados en la solicitud correctamente, aunque se manejan y procesan correctamente al ejecutar los end points. Por ejemplo, una clase
CreatePaymentRequest
que se recibe desde el cuerpo de la solicitud HTTP contiene una propiedad de tipoNotional
, que se compone de un valordecimal
y un valorstring
. El ejemplo generado no incluye las propiedades para el tipoNotional
, pero en cambio incluye llaves vacías ({}
) para las propiedadesnotional1
ynotional2
de la claseRequest
. Aquí hay un ejemplo del ejemplo generado y del ejemplo esperado:Ejemplo generado
Ejemplo esperado
El esquema generado también parece estar mal, ya que no incluye las propiedades para
Notional
, aunque está listado correctamente en la sección “Esquemas” en la parte inferior.Posibles soluciones
Verificar la configuración de Swashbuckle
Una posible solución es verificar la configuración de Swashbuckle. Esto podría incluir verificar la configuración de
services.AddSwaggerGen();
enConfigureServices
, y asegurarse de que se estén utilizando las opciones apropiadas.Intentar con anotaciones JSON
Otra solución podría ser intentar usar anotaciones JSON para especificar el comportamiento del tipo
Notional
. Esto podría incluir usar el atributo[JsonProperty]
para especificar el nombre de la propiedad JSON paraAmount
yCurrency
, y usar el atributo[JsonConstructor]
para especificar el constructor para el tipoNotional
.Intentar con un proveedor de ejemplo personalizado
Una tercera solución podría ser intentar crear un proveedor de ejemplo personalizado para la interfaz de usuario de Swashbuckle. Esto podría incluir la implementación de la interfaz
IExamplesProvider
y proporcionar ejemplos personalizados para el tipoNotional
. El proveedor de ejemplos personalizado luego podría registrarse usando el métodoservices.AddSwaggerGen(c => c.ExampleFilters.Add(...));
enConfigureServices
.Independientemente de la solución, es importante asegurarse de que los ejemplos generados reflejen adecuadamente el comportamiento de la API, ya que esto puede mejorar en gran medida la experiencia del usuario para los clientes de la API.