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.

Swagger especifica el tipo de objeto en ASP.NET.

Tengo la siguiente clase:

public class UpdateUserRequest
{
    public string Id {get;set;}
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public int Age {get;set;}
}

Y tengo el siguiente endpoint:

[HttpPut]
[Route("/[controller]/update/user/{userId}")]
public IActionResult Update(UpdateUserRequest update, string userId)
{
    // lógica de código para actualizar un usuario
    // etc...
}

Si ejecuto mi proyecto con ese código, Swagger generará la documentación adecuada. El problema es que quiero modificar mi endpoint y, en lugar de tomar un UpdateUserRequest update, me gustaría tomar un object update. En otras palabras, así es como me gustaría que se vea mi endpoint:

[HttpPut]
[Route("/[controller]/update/user/{userId}")]
public IActionResult Update(object update, string userId)
{
    // lógica de código para actualizar un usuario
    // etc...
}

La razón por la cual quiero aceptar un object en lugar de un UpdateUserRequest es porque quiero habilitar mi API para actualizar solo las propiedades que se envían a través de la solicitud. En otras palabras, si el usuario envía:

{ "FirstName":"Tono" }

Entonces solo actualizaré la propiedad FirstName sin establecer las otras propiedades como nulas.

¿Cómo puedo indicarle a Swagger que genere documentación como si el método aceptara un parámetro UpdateUserRequest cuando en realidad está aceptando un objeto? Cuando coloco un objeto como parámetro, Swagger muestra esto:

Imagen de Swagger

¿Cómo puedo hacer que muestre un JSON con el formato de un UpdateUserRequest?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para indicarle a Swagger que genere documentación como si el método aceptara parámetros de tipo UpdateUserRequest aunque esté aceptando un object, puedes utilizar el atributo SwaggerRequestExample.

    Aquí tienes un ejemplo de cómo puedes utilizarlo:

    [HttpPut]
    [Route("/[controller]/update/user/{userId}")]
    public IActionResult Update([SwaggerRequestExample(typeof(UpdateUserRequest), typeof(UpdateUserRequestExample))] object update, string userId)
    {
        // código lógico para actualizar un usuario
        // etc...
    }
    

    En este fragmento de código, hemos añadido el atributo [SwaggerRequestExample] al parámetro update. El parámetro typeof(UpdateUserRequest) especifica el tipo de objeto que queremos utilizar como ejemplo. El parámetro typeof(UpdateUserRequestExample) especifica la clase que crearemos más adelante para contener el valor de ejemplo.

    A continuación, crearemos la clase UpdateUserRequestExample:

    public class UpdateUserRequestExample : IExamplesProvider
    {
        public object GetExamples()
        {
            return new UpdateUserRequest
            {
                Id = "1",
                FirstName = "Ejemplo",
                LastName = "Usuario",
                Age = 25
            };
        }
    }
    

    Esta clase implementa la interfaz IExamplesProvider y proporciona un valor de ejemplo para la clase UpdateUserRequest. En este caso, estamos devolviendo una instancia de UpdateUserRequest con algunos valores de ejemplo.

    Al utilizar el atributo SwaggerRequestExample y la interfaz IExamplesProvider, podemos indicarle a Swagger que genere documentación como si el método aceptara parámetros de tipo UpdateUserRequest aunque esté aceptando un object.

    Ahora, cuando Swagger genere la documentación, mostrará un ejemplo de cuerpo de solicitud JSON con el formato de un objeto UpdateUserRequest.

Comments are closed.