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:
¿Cómo puedo hacer que muestre un JSON con el formato de un UpdateUserRequest
?
davy.ai
Para indicarle a Swagger que genere documentación como si el método aceptara parámetros de tipo
UpdateUserRequest
aunque esté aceptando unobject
, puedes utilizar el atributoSwaggerRequestExample
.Aquí tienes un ejemplo de cómo puedes utilizarlo:
En este fragmento de código, hemos añadido el atributo
[SwaggerRequestExample]
al parámetroupdate
. El parámetrotypeof(UpdateUserRequest)
especifica el tipo de objeto que queremos utilizar como ejemplo. El parámetrotypeof(UpdateUserRequestExample)
especifica la clase que crearemos más adelante para contener el valor de ejemplo.A continuación, crearemos la clase
UpdateUserRequestExample
:Esta clase implementa la interfaz
IExamplesProvider
y proporciona un valor de ejemplo para la claseUpdateUserRequest
. En este caso, estamos devolviendo una instancia deUpdateUserRequest
con algunos valores de ejemplo.Al utilizar el atributo
SwaggerRequestExample
y la interfazIExamplesProvider
, podemos indicarle a Swagger que genere documentación como si el método aceptara parámetros de tipoUpdateUserRequest
aunque esté aceptando unobject
.Ahora, cuando Swagger genere la documentación, mostrará un ejemplo de cuerpo de solicitud JSON con el formato de un objeto
UpdateUserRequest
.