Anexsoft | Blog y dictado de cursos de Tecnología

En este encontrarás tutoriales de tecnología como PHP, ASP.NET MVC, Front-End, entre otros y cursos exigentes de modalidad online que te ayudarán a crecer profesionalmente.

Queremos mejorar la calidad de nuestros cursos. Por favor ayúdanos llenando esta pequeña encuesta
Validando los parámetros de una API Rest con Net Core
Actualizado el 05 Agosto, 2018 y leído 1,173 veces
Calificación: Sin calificar 10

Validando los parámetros de una API Rest con Net Core

Anexsoft

En esta nueva entrada vamos a ver como proteger los parámetros hacia nuestras APIs usando Net Core. Por ejemplo, es común usar DTOs como objetos que serán pasados a nuestra API para validar que X propiedad cumpla cierta condición.

 

¿Por qué no usar Data Annotations?

Si bien es es posible, no es muy óptimo cuando queremos hacer validaciones complejas y además, el código de nuestra clase queda horrible al tener que usar muchos decoradores (TagAttributes) para nuestras propiedades.

 

Fluent Validation

Es una capa abstracta de validación creado por Jeremy Skinner en el cual vamos a definir reglas y que clase lo va a implementar.

 

Primeros pasos

Vamos a instalar el paquete ejecutando un comando del NuGet o bien puden buscarlo y agregarlo manualmente desde la UI. El paquete que nos interesa es el siguiente:

Install-Package FluentValidation.AspNetCore

NOTA: también lo tenemos disponible para NETFramework.

 

Codificando

Clase DTO

Vamos a crear una clase DTO en nuestro API de NetCore

public class UserCreateDto
{
    public string Name { get; set; }
    public string LastName { get; set; }
    public DateTime? Birthday { get; set; }
    public JobTitle JobTitle { get; set; }
}

public enum JobTitle
{
    Engineer,
    Lawyer,
    Medic,
    BusinessAdministrator
}

 

Clase de validación

Ahora vamos a crear la regla de validación y le decimos que es del tipo UserCreateDto para que sepa que clase usar para la validación.

public class UserCreateValidation : AbstractValidator<UserCreateDto>
{
    public UserCreateValidation()
    {
        RuleFor(x => x.Name).NotEmpty().WithMessage("Please enter your name");
        RuleFor(x => x.LastName).NotEmpty();
        RuleFor(x => x.JobTitle).IsInEnum();

        // Custom validation
        RuleFor(x => x.Birthday).NotNull().Must(BeAValidAge).WithMessage("Must be a valid age");
    }

    // Must be greater than 18 years old
    private bool BeAValidAge(DateTime? date)
    {
        if (date.HasValue)
            return (DateTime.Now.Year - date.Value.Year) >= 21;

        return false;
    }
}
  • Para la propiedad name le estoy diciendo que el campo ingresado no puede ser vacío y un mensaje personalizado.
  • Para la propiedad lastName lo mismo
  • Para la propeidad JobTitle el cual es un Enum le estoy diciendo que considere solo los enteros que almacena este.
  • Para la propiedad Birthday estoy creando una regla personalizado.
    • Que el valor ingresado no sea nulo, podemos agregar también un .NotNull() ya que dicha propiedad soporta nulos.
    • Que el valor ingresado pertenezca a una edad mayor o igual a 21 años

 

 

Configurando nuestro StartUp

Registramos nuestra regla de validación y el FluentValidation, con esto ya podrá estar disponible desde el clásico ModelState.IsValid

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
            .AddFluentValidation();

    // My custom validations
    services.AddTransient<IValidator<UserCreateDto>, UserCreateValidation>();
}

 

Creando nuestro controlador y validado

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
    // POST api/values
    [HttpPost]
    public IActionResult Post([FromBody] UserCreateDto model)
    {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        return NoContent();
    }
}

 

¿Sencillo no? y hacemos mucho más.

 

¿Cómo validar parámetros opcionales?

Hagamos el ejemplo de un update parcial cuando se usa el verbo PATCH. Solo nos interesa validar aquellos parámetros que hayan sido especificado así que debemos permitir que las propiedades de nuestra clase soporten NULL.

public class UserPatchDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string LastName { get; set; }
    public DateTime? Birthday { get; set; }
    public JobTitle? JobTitle { get; set; }
}

 

La regla de validación

public class UserPatchValidation : AbstractValidator<UserPatchDto>
{
    public UserPatchValidation()
    {
        RuleFor(x => x.Id).NotEmpty();

        When(x => x.Name != null, () => {
            RuleFor(x => x.Name).MinimumLength(5);
        });

        When(x => x.LastName != null, () => {
            RuleFor(x => x.LastName).MinimumLength(5);
        });

        RuleFor(x => x.JobTitle).IsInEnum();

        // Custom validation
        RuleFor(x => x.Birthday).Must(BeAValidAge).WithMessage("Must be a valid age");
    }

    // Must be greater than 18 years old
    private bool BeAValidAge(DateTime? date)
    {
        if (date.HasValue)
            return (DateTime.Now.Year - date.Value.Year) >= 21;

        return true;
    }
}
  • Solo cuando se especifique el nombre o el apellido debe considerar que como mínimo se agregue 5 caracteres.
  • El Enum al soportar NULL va a ignorar la validación.
  • El DateTime sucede lo mismo.

 

Implementación

Inyectamos la dependencia

services.AddTransient<IValidator<UserPatchDto>, UserPatchValidation>();

Creamos la acción de nuestro controlador

[HttpPatch]
public IActionResult Patch([FromBody] UserPatchDto model)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);

    return NoContent();
}

¡Adquiera ya!

  • Software de Venta e Inventario hecho en PHP y Codeigniter

    Software de Venta e Inventario hecho en PHP y Codeigniter
  • Código de fuente de Red Social desarrollada en ASP.NET MVC

    Código de fuente de Red Social desarrollada en ASP.NET MVC
  • Software de Portafolio Profesional hecho en ASP.NET MVC 5 C#

    Software de Portafolio Profesional hecho en ASP.NET MVC 5 C#

Últimas publicaciones

Encuesta

¿Cómo nos conociste?

Síguenos

Estudia con nosotros y crece profesionalmente

Nuestros cursos han sido hecho en base a lo que demanda el mercado hoy en día.
La experiencia obtenida es la de un ambiente laboral.

Anexsoft
© 2018 Anexsoft, blog y cursos online de TI.