none
FORMATO JSON A API RRS feed

  • Pregunta

  • Buenas , ya había hecho esta pregunta y me contestaron muy bien los maestros del foro, bueno ya descubrí mi error y es por las fechas, cuando la entidad BEFase declaro las propiedades como datetime obtengo el error

    ASP.NET Web API HTTP 400 Bad Request

    pero si las declaro como String , entonces no hay ningún problema

    este es el formato que envío

    {"Nombre":"","IDTipo":"15","IDEstado":"25","Descripcion":"aaa","Objetivos":"aaa","Beneficios":"aaa",
    "Fase":[{"IDFase":"15","FechaInicio":"01/09/2019","FechaFin":"01/09/2019","Monto":"0"},
    {"IDFase":"16","FechaInicio":"01/09/2019","FechaFin":"01/09/2019","Monto":"0"}]}


    en este punto cae

    response = await client.PostAsync(serviceUrl, request.Content);
                    response.EnsureSuccessStatusCode();

    las entidades

    public class BEProyecto
        {
            public BEProyecto()
            {
                this.Fase = new List<BEFase>();
            }
            public int IDProyecto { get; set; }
            public string Nombre { get; set; }
            public int IDTipo { get; set; }
            public int IDEstado { get; set; }
            public string Descripcion { get; set; }
            public string Objetivos { get; set; }
            public string Beneficio { get; set; }
            //public string Comentarios { get; set; }
            public List<BEFase> Fase { get; set; }
    
            //public List<BEComentario> Comentario { get; set; }
        }

      public class BEFase
        {
            public int IDFase { get; set; }
            public DateTime FechaInicio { get; set; }
            public DateTime FechaFin { get; set; }
            public decimal Monto { get; set; }
           
        }
    }

    Como puedo hacer para mantener la propiedad como datetime y no pasarla a string y no tener problemas con el request

    miércoles, 4 de septiembre de 2019 3:02

Respuestas

  • ¿casteo?

    Lo que haces es inicializar la variable con un objeto de tipo Date. El argumento de constructor es una string con un formato aceptable, digamos new Date("5/9/2019"), que supongo sería el resultado del val()...

    ---

    si inicializas la variable con un string, la variable será un string. Es js... ese era tu problema inicial, si mal no entiendo, no ?



    Hola , si en efecto tenía que ver algo con la inicialización de las propiedades de fecha , al final lo solucioné asi, declarando la propiedad como nullable.

     public DateTime? FechaCreacion { get; set; }

    • Marcado como respuesta Augusto C jueves, 5 de septiembre de 2019 20:10
    jueves, 5 de septiembre de 2019 20:09

Todas las respuestas

  • hola

    que has cambiado ? aqui

    FORMATO JSON A WEB API

    recomende usar el

    JsonConvert.SerializeObject()

    pero no veo que lo menciones, digo entiendes cual es el problema pero no has intentado nada de las recomendaciones para resolverlo

    remarco, no crees el json coo string, instancia las clases asigna los datos y serializa

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 4 de septiembre de 2019 3:24
  • hola

    que has cambiado ? aqui

    FORMATO JSON A WEB API

    recomende usar el

    JsonConvert.SerializeObject()

    pero no veo que lo menciones, digo entiendes cual es el problema pero no has intentado nada de las recomendaciones para resolverlo

    remarco, no crees el json coo string, instancia las clases asigna los datos y serializa

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    Hola Leandro ,no entiendo bien a que te refieres con serializar las clases yo los datos que envìo lo hago dessde una vista con javascript como ya comenté el error es en esta línea

    response = await client.PostAsync(serviceUrl, request.Content);

    es algo como esto voy a poner código solo de referencia


    lo mando el método $ajax del jquery 

    así masomenos está el código, asi que como verás no serializo nada en clases de controlador, sino todo directamente desde la vista.


    • Editado Augusto C miércoles, 4 de septiembre de 2019 18:58
    • Propuesto como respuesta Pablo RubioModerator jueves, 5 de septiembre de 2019 17:53
    miércoles, 4 de septiembre de 2019 13:28
  • hola

    >>yo los datos que envìo lo hago dessde una vista con javascript como ya comenté el error es en esta línea

    esa linea no es javascript

    el $.ajax y el CargarDatos() que muestras es javascript, la linea con el await eso es codigo c#

    de donde sale request.Content ?

    como creas ese json que envias ? porque no deberias enviar directo lo que obtuviste desde el mapeo que ingreso del $.ajax al servicio, deberias transformarlo y volverlo a serializar a la class que defines como modelo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 4 de septiembre de 2019 15:35
  • Hola Leanddro

    "esa linea no es javascript"

    Eso lo tengo claro

    "el $.ajax y el CargarDatos() que muestras es javascript, la linea con el await eso es codigo c#"

    claro también,

    "de donde sale request.Content ?"

    sale de un método creado en el api

    lo envío desde postman invocando la url del api tal y como mostré anteriormente



    • Editado Augusto C jueves, 5 de septiembre de 2019 23:40
    miércoles, 4 de septiembre de 2019 18:56
  • hola

    No entiendo, el problema no esta en el PostAsync ? si es asi que dalos le envias en el body?

    porque alli veo que intentas deserializar la respuesta de la llamada del post cuando entendi que debia ser al contrario serializar y usar esta en el PostAsync

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 4 de septiembre de 2019 19:14
  • Hola

    No entiendo, el problema no esta en el PostAsync ? 

    asi es 

    si es asi que dalos le envias en el body?

    mando toda la cadena de json testeando el servicio mediante postman

    https://www.getpostman.com/


    • Editado Augusto C miércoles, 4 de septiembre de 2019 19:51
    miércoles, 4 de septiembre de 2019 19:51
  • >>mando toda la cadena de json testeando el servicio mediante postman

    Pero lo que implementas en postman no lo estas llevando bien desde codigo, tienes que serializar los datos para enviarlos en el PostAsync() no deserializar lo que recibes

    no veo donde serializas los datos que generen un json para enviar los datos

    entendiste mi otra respuesta cuando mencione

    HttpClient GetAsync, PostAsync, SendAsync in C#

    analiza el ultimo ejemplo en donde usa

    string strPayload = JsonConvert.SerializeObject(payload);

    asi es como serializas las class de c# a json para generar el contentent del httpclient

    ---

    Donde usas algo como esto

    using (var client = new HttpClient())
                {
                    HttpRequestMessage request = new HttpRequestMessage
                    {
                        Method = HttpMethod.Post,
                        RequestUri = u,
                        Content = c
                    };
    
                    HttpResponseMessage result = await client.SendAsync(request);

    donde ese context deberia ser un

    HttpContent c = new StringContent(payload, Encoding.UTF8, "application/json");

    ese payload seria la seralizacion de la class a json previa asignacion de cada propiedad

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 4 de septiembre de 2019 20:45
  • >>mando toda la cadena de json testeando el servicio mediante postman

    Pero lo que implementas en postman no lo estas llevando bien desde codigo, tienes que serializar los datos para enviarlos en el PostAsync() no deserializar lo que recibes

    no veo donde serializas los datos que generen un json para enviar los datos

    entendiste mi otra respuesta cuando mencione

    HttpClient GetAsync, PostAsync, SendAsync in C#

    analiza el ultimo ejemplo en donde usa

    string strPayload = JsonConvert.SerializeObject(payload);

    asi es como serializas las class de c# a json para generar el contentent del httpclient

    ---

    Donde usas algo como esto

    using (var client = new HttpClient())
                {
                    HttpRequestMessage request = new HttpRequestMessage
                    {
                        Method = HttpMethod.Post,
                        RequestUri = u,
                        Content = c
                    };
    
                    HttpResponseMessage result = await client.SendAsync(request);

    donde ese context deberia ser un

    HttpContent c = new StringContent(payload, Encoding.UTF8, "application/json");

    ese payload seria la seralizacion de la class a json previa asignacion de cada propiedad

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Hola, recién lo estoy implementando de esta forma, este código lo tengo en el controlador






    • Editado Augusto C jueves, 5 de septiembre de 2019 23:40
    jueves, 5 de septiembre de 2019 15:15
  • Fases.FechaInicio = new Date($(this).closest("tr").find('input[name="fechainicio"]').val()),
    Fases.FechaFin = new Date($(this).closest("tr").find('input[name="fechafin"]').val()), //row.cells[4].innerHTML,

    Hola, me estas sugiriendo que castee las fechas?,pero el problema no es ahí es en la fecha que no inicializo en el objeto proyecto.
    jueves, 5 de septiembre de 2019 15:35
  • ¿casteo?

    Lo que haces es inicializar la variable con un objeto de tipo Date. El argumento de constructor es una string con un formato aceptable, digamos new Date("5/9/2019"), que supongo sería el resultado del val()...

    Le digo casteo porque esas filas de la tabla si tienen valor

    Y con que objeto sugieres que la inicialize ,

    • Editado Augusto C jueves, 5 de septiembre de 2019 16:01
    jueves, 5 de septiembre de 2019 16:00
  • Deleted
    jueves, 5 de septiembre de 2019 18:10
  • ¿casteo?

    Lo que haces es inicializar la variable con un objeto de tipo Date. El argumento de constructor es una string con un formato aceptable, digamos new Date("5/9/2019"), que supongo sería el resultado del val()...

    ---

    si inicializas la variable con un string, la variable será un string. Es js... ese era tu problema inicial, si mal no entiendo, no ?



    Hola , si en efecto tenía que ver algo con la inicialización de las propiedades de fecha , al final lo solucioné asi, declarando la propiedad como nullable.

     public DateTime? FechaCreacion { get; set; }

    • Marcado como respuesta Augusto C jueves, 5 de septiembre de 2019 20:10
    jueves, 5 de septiembre de 2019 20:09
  • esa no es una solucion

    cuando pones la fecha en null quiere decir que si le pasas algo que no puede convertir no te asignara el valor

    prueba de evaluar que valor recibes en esa propiedad fecha y veras que esta en null, porque el valor que le pasas no lo reconoce

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 5 de septiembre de 2019 21:39
  • esa no es una solucion

    cuando pones la fecha en null quiere decir que si le pasas algo que no puede convertir no te asignara el valor

    prueba de evaluar que valor recibes en esa propiedad fecha y veras que esta en null, porque el valor que le pasas no lo reconoce

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Hola he solucionado el problema a medias

    "prueba de evaluar que valor recibes en esa propiedad fecha y veras que esta en null, porque el valor que le pasas no lo reconoce"

    Eso no es del todo cierto ,justamente cuando no paso ningún valor de fecha en el objeto que construyo desde  desde el javascript entonces lo toma como null y funciona,

    El problema viene mas bien cuando si envío valores de fecha con javascript, entonces ahí con DateTime? o DateTime igual falla la aplicación es decir que no se hace bien el casteo para el web api.

    intenté con estas funciones 

      Fases.FechaInicio = new Date($(this).closest("tr").find('input[name="fechainicio"]').val()),
       Fases.FechaFin = new Date($(this).closest("tr").find('input[name="fechafin"]').val()), 

    y veo que en el json se castea la fecha a un tipo que el webapi debería recibir pero igual me sale el mismo error



    • Editado Augusto C jueves, 5 de septiembre de 2019 22:19
    jueves, 5 de septiembre de 2019 22:18