es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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<>> PostCreate(CreatePaymentApi_Request request)
{
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>

Tags:  , , ,

Answer

  1. Avatar for 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 tipo Notional, que se compone de un valor decimal y un valor string. El ejemplo generado no incluye las propiedades para el tipo Notional, pero en cambio incluye llaves vacías ({}) para las propiedades notional1 y notional2 de la clase Request. Aquí hay un ejemplo del ejemplo generado y del ejemplo esperado:

    Ejemplo generado

    {
      "tradeId": 0,
      "settlementMeans": "SWIFT",
      "notional1": {},
      "notional1Rate": 0,
      "notional2": {},
      "notional2Rate": 0,
      "paymentReference": "string",
      "description": "string"
    }
    

    Ejemplo esperado

    {
      "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 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(); en ConfigureServices, 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 para Amount y Currency, y usar el atributo [JsonConstructor] para especificar el constructor para el tipo Notional.

    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 tipo Notional. El proveedor de ejemplos personalizado luego podría registrarse usando el método services.AddSwaggerGen(c => c.ExampleFilters.Add(...)); en ConfigureServices.

    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.

Comments are closed.