Principales respuestas
API Web

Pregunta
-
Estimados buen día.
Hace un mes empecé a desarrollar aplicaciones web utilizando ASP.NET.CORE.3.1 como el Backend de mi proyecto utilizando SQL Server como DB.
Después de crear el proyecto Datos, Entidad y Web, estructuré los Contextos, los Mapping, los Models y el Controller de una clase Categorias que contiene estos datos:
public class Categorias
{
public int IdCategoria { get; set; }
[Required]
[StringLength(50, MinimumLength = 3, ErrorMessage = "El Nombre de la Categoría debe tener más de 3 y menos de 50 Caracteres")]
public string Nombre { get; set; }
[StringLength(150)]
public string Descripcion { get; set; }
public bool Estado { get; set; }
}Estructuré el Controller con la siguiente código que detalla el CRUD:
namespace DecafeApp.Web.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class CategoriasController : ControllerBase
{
private readonly DbContextDecafeApp _context;
public CategoriasController(DbContextDecafeApp context)
{
_context = context;
}
// GET: api/Categorias/Listar
[HttpGet("[action]")]
public async Task<IEnumerable<CategoriasViewModel>> Listar()
{
var categoria = await _context.categorias.ToListAsync();
return categoria.Select(c => new CategoriasViewModel
{
IdCategoria = c.IdCategoria,
Nombre = c.Nombre,
Descripcion = c.Descripcion,
Estado = c.Estado
});
}[HttpPost("[action]")]
public async Task<ActionResult> Crear([FromBody] CrearViewModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
Categorias categoria = new Categorias
{
Nombre = model.Nombre,
Descripcion = model.Descripcion,
Estado = true
};
_context.categorias.Add(categoria);
try
{
await _context.SaveChangesAsync();
}
catch (Exception)
{
return BadRequest();
}
return Ok();
}[HttpPut("[action]")]
public async Task <IActionResult> Actualizar([FromBody] ActualizarViewModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (model.IdCategoria <=0)
{
return BadRequest();
}
var categoria = await _context.categorias.FirstOrDefaultAsync(c => c.IdCategoria == model.IdCategoria);
if (categoria == null)
{
return NotFound();
}
categoria.Nombre = model.Nombre;
categoria.Descripcion = model.Descripcion;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
// Guardar Excepción
return BadRequest();
}
return Ok();
}Para probar si mi backend funcionara correctamente utilicé FIDDLER el cual me muestra que el CRUD LISTAR, CREAR funcionan correctamente pero a la hora de ejecutar ACTUALIZAR me señala un error de tipo 400:
He buscado muchas alternativas de solución pero no he podido resolver este tema, el cual me impide seguir avanzando con el desarrollo de mi proyecto.
Agradeceré sus sugerencias que me ayuden a resolver este inconveniente.
Saludos cordiales;
Eric Marín
Respuestas
-
Hola Sergio.
Tu sugerencia me ayudo mucho para solucionar el inconveniente que se me presentaba.
Pero esta solución se dio en mi Fronted ya que estaba invocando en los metodos el idcategoria en vez de idCategoria tal como me lo sugeriste.
Solo al cambiar una letra de minúscula a mayúscula se solucionó.
Gracias por tu apoyo
Saludos cordiales;
- Marcado como respuesta Huacnin miércoles, 13 de mayo de 2020 19:16
-
Hola, ya he visto el problema según el mensaje de tu última respuesta. Recuerda que c# es sensible a mayúsculas.
En el json que envías mandas idcategoria que no puede deserializarse a IdCategoria. Debes enviar idCategoria
Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos
- Propuesto como respuesta Sergio ParraModerator martes, 12 de mayo de 2020 13:18
- Marcado como respuesta Huacnin miércoles, 13 de mayo de 2020 19:06
-
Entonces el problema está en la clase que usas para enviar el mensaje y realizar la llamada. Cómo es tu modelo ? Deberias cambiar a int esa propiedad IdCategoria.
Puedes poner el código en el que realzias la llamada a ese api? El problema lo tienes en tu aplicacion Vue que trata esa propiedad como una cadena string. Revisa tu Frontend
Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos
- Editado Sergio ParraModerator miércoles, 13 de mayo de 2020 17:48
- Marcado como respuesta Huacnin miércoles, 13 de mayo de 2020 21:06
Todas las respuestas
-
Hola
Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, vamos a darte seguimiento e investigaremos para buscar la mejor respuesta para ti.
Tu error dice que es un problema de casteo en {"$.idCategoria" : ["The JSON value could not be converted to System.Int32"]}
Puedes mostrarme que tienes en los valores del JSON o el tipo de dato con el que se esta manejando?
Gracias por usar los foros de MSDN.
Luis Diego Mora
____
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
- Marcado como respuesta Huacnin lunes, 11 de mayo de 2020 19:14
- Desmarcado como respuesta Sergio ParraModerator martes, 12 de mayo de 2020 13:17
-
El status 400 es un "Bad Request". Dado que en método Actualizar tienes tres return BadRequest, un primer paso que deberías realizar es especificar cuál de los tres es el que está fallando, para que podamos centrarnos en investigar por qué se produce ese fallo. Esto por supuesto es muy sencillo de determinar en tiempo de desarrollo con solo ejecutar el programa paso a paso con el debugger. Pero aparte de eso, por si acaso el error ocurre en producción es conveniente que devuelvas un texto diferenciador dentro de cada uno de los mensajes de error, por ejemplo, return BadRequest("IdCategoria es negativo").
- Propuesto como respuesta Sergio ParraModerator sábado, 9 de mayo de 2020 22:36
-
hola
Por el mensaje que se observa no es un error 400 de http, sino que estas obteniendo una respuesta con ese json que recibes, es mas hay un mensaje indicando
The JSON value could not be converted to System.Int32
No se con que datos estas invocando la funcionalidad, pero revisa las propiedades que reciben numeros a ver si alguna estas asignandola de forma incorrecta
aunque al tener solo una en el modelo deberia ser el IdCategoria el que cause el problema
Es ams veo que tambien lo validas cuando usas
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}si pones un breakpoint en el codigo, puede ver que ingresa y pasa esa validacion?
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Propuesto como respuesta Sergio ParraModerator sábado, 9 de mayo de 2020 22:37
-
hola
Por el mensaje que se observa no es un error 400 de http, sino que estas obteniendo una respuesta con ese json que recibes, es mas hay un mensaje indicando
The JSON value could not be converted to System.Int32
No se con que datos estas invocando la funcionalidad, pero revisa las propiedades que reciben numeros a ver si alguna estas asignandola de forma incorrecta
aunque al tener solo una en el modelo deberia ser el IdCategoria el que cause el problema
Es ams veo que tambien lo validas cuando usas
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}si pones un breakpoint en el codigo, puede ver que ingresa y pasa esa validacion?
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
ArgentinaSi se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos
-
-
Hola Luis, gracias por tu respuesta.
Estos son los datos que tengo en JSON el cual envio para su actualización y me genera un error
{"idcategoria":"4",
"nombre":"Menús & Buffets",
"descripcion":"Platos de Comidas"
}
public class Categorias { public int IdCategoria { get; set; } [Required] [StringLength(50, MinimumLength = 3, ErrorMessage = "El Nombre de la Categoría debe tener más de 3 y menos de 50 Caracteres")] public string Nombre { get; set; } [StringLength(150)] public string Descripcion { get; set; } public bool Estado { get; set; } } Esta es
la estructura de mi objeto.
Saludos
- Editado Sergio ParraModerator miércoles, 13 de mayo de 2020 7:18 formatear codigo fuente
-
Hola, ya he visto el problema según el mensaje de tu última respuesta. Recuerda que c# es sensible a mayúsculas.
En el json que envías mandas idcategoria que no puede deserializarse a IdCategoria. Debes enviar idCategoria
Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos
- Propuesto como respuesta Sergio ParraModerator martes, 12 de mayo de 2020 13:18
- Marcado como respuesta Huacnin miércoles, 13 de mayo de 2020 19:06
-
hola
Si usas tools como ser
veras que las propiedades no mapean
Deberias poner las propiedades en minuscula o usar el [JsonProperty]
using System; using System.Collections.Generic; using System.Globalization; using Newtonsoft.Json; public partial class Categorias { [JsonProperty("idcategoria")] public long Idcategoria { get; set; } [JsonProperty("nombre")] public string Nombre { get; set; } [JsonProperty("descripcion")] public string Descripcion { get; set; } }
pero hay un detalle, el valor del IdCategoria deberias ponerlo sin comillas para que sea numerico
{ "idcategoria":4, "nombre":"Menús & Buffets", "descripcion":"Platos de Comidas" }
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Propuesto como respuesta Sergio ParraModerator miércoles, 13 de mayo de 2020 7:18
-
Estimado Luis
Hice todas las actualizaciones a mi consulta y me sigue saliendo el mismo error.
Al testear nuevamente mi aplicación con Fiddler ejecute estos parametros de JSON:
{"idCategoria":"1","nombre":"Comidas","descripcion":"Platos de Comidas"}Me sigue arrojando el error 400. Pero si ejecuto este JSON:
{"idCategoria":1,"nombre":"Comidas","descripcion":"Platos de Comidas"}, El valor de IdCategoria sin las comillas dobles
La actualización se ejecuta, pero al ejecutar desde mi FRONTED, Vuejs, me sigue arrojando el mismo error.
Saludos cordiales;
Eric Marín
-
Entonces el problema está en la clase que usas para enviar el mensaje y realizar la llamada. Cómo es tu modelo ? Deberias cambiar a int esa propiedad IdCategoria.
Puedes poner el código en el que realzias la llamada a ese api? El problema lo tienes en tu aplicacion Vue que trata esa propiedad como una cadena string. Revisa tu Frontend
Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos
- Editado Sergio ParraModerator miércoles, 13 de mayo de 2020 17:48
- Marcado como respuesta Huacnin miércoles, 13 de mayo de 2020 21:06
-
Hola Sergio.
Tu sugerencia me ayudo mucho para solucionar el inconveniente que se me presentaba.
Pero esta solución se dio en mi Fronted ya que estaba invocando en los metodos el idcategoria en vez de idCategoria tal como me lo sugeriste.
Solo al cambiar una letra de minúscula a mayúscula se solucionó.
Gracias por tu apoyo
Saludos cordiales;
- Marcado como respuesta Huacnin miércoles, 13 de mayo de 2020 19:16