2
respostas

A mensagem personalizada de erro não está indo na resposta 400

Chamando a http://localhost:5050/RegistroPonto passando no body:

{
    "chapa": " ",
  "registro": "2023-10-05T23:08:07.663Z",
  "latitude": 0,
  "longitude": 0
}

O erro que está retornando ainda é genérico:

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "00-6c7bbe276c3a56487b4478d285e9c4bc-c40c96f1965d91af-00",
    "errors": {
        "registroPonto": [
            "The registroPonto field is required."
        ],
        "$.chapa": [
            "The JSON value could not be converted to System.Int32. Path: $.chapa | LineNumber: 1 | BytePositionInLine: 13."
        ]
    }
}

O meu controller:

using backend.Models;
using Microsoft.AspNetCore.Mvc;

namespace backend.Controllers;

[ApiController]
[Route("[controller]")]

public class RegistroPontoController : ControllerBase
{
    private static List<RegistroPonto> registros = new List<RegistroPonto>();

    [HttpPost]
    public IActionResult AdicionaRegistroPonto([FromBody] RegistroPonto registroPonto)
    {

        registros.Add(registroPonto);
        Console.WriteLine(registroPonto.Chapa);
        Console.WriteLine(registroPonto.Registro);
        Console.WriteLine(registroPonto.Latitude);
        Console.WriteLine(registroPonto.Longitude);

        return Ok("Registro de ponto adicionado com sucesso.");
    }
}

O meu model:

using System.ComponentModel.DataAnnotations;

namespace backend.Models;

public class RegistroPonto
{
    [Required(ErrorMessage = "A chapa do colaborador é obrigatória.")]
    public int Chapa { get; set; }

    [Required(ErrorMessage = "A data do registro é obrigatória.")]
    public DateTime Registro { get; set; }

    [Required(ErrorMessage = "A latitude do registro é obrigatória.")]
    public float Latitude { get; set; }

    [Required(ErrorMessage = "A longitude do registro é obrigatória.")]
    public float Longitude { get; set; }
}

A diverença do projeto da aula para o meu é que não consegui executar o insominia com https então modifiquei:

"applicationUrl": "http://localhost:5050",

Estou no Windows executando no VScode e testando via Insominia.

2 respostas

Oii, André! Tudo bem?

O erro basicamente é devido ao tipo de dado que está sendo enviado no campo "chapa" e também porque o campo "registroPonto" não está sendo enviado.

Observe que no model RegistroPonto, o campo "chapa" está definido como um inteiro (int), mas no corpo da requisição você está enviando uma string vazia (" "). E isso está causando um erro de conversão, pois o sistema não consegue converter uma string vazia para um número inteiro. Outro ponto a se observar é o campo "registroPonto" que não está sendo enviado na requisição, porém é um campo obrigatório que precisamos dar uma atenção, da mesma forma que foi definido em seu model.

Como sugestão, recomendo adicionar um número inteiro no campo "chapa" e também enviar o campo "registroPonto" na sua requisição. Para corrigir esses problemas, você deve enviar um número inteiro no campo "chapa" e também enviar o campo "registroPonto" na sua requisição. Seguindo essa lógica, o campo "chapa" será um número inteiro e o "registroPonto" está presente na requisição.

Espero que dê certo. Continue interagindo no fórum compartilhando suas dúvidas, projetos e sugestões.

Bons estudos, André!

Nathalia,

Então é isso que quero, causar o erro, mas o retorno da API não pode ser genérico tem que ser o retorno codificado. No caso da CHAPA que está vazia, o erro retornado deve ser "A chapa do colaborador é obrigatória." e não "The JSON value could not be converted to System.Int32. Path: $.chapa | LineNumber: 1 | BytePositionInLine: 13."

Como faço para resolver isso? Tem o retorno retornado tratado?

Atenciosamente,

André Oliveira