none
Problemas con WEB API RRS feed

  • Pregunta

  • Hola amigos,

    Quisiera que me ayudaran, les cuento, estoy investigando son Web api y mvc 4, realice el ejemplo por defecto y puedo ejecutarlo sin problema, el problema se da cuando trato de ejecutarlo desde JQuery, le envío el ejemplo:

    respuesta al ejecutar desde el navegador.

    <Per><Id>1</Id><Name>Juan Perez</Name></Per>

    Metodo del controller

     public Per GetFull(string apikey, string name)
            {
                Per per = new Per();
                per.Id = 1;
                per.Name = "Juan Perez";
                return per;
            }

    En el html tengo lo siguiente:

    <script>
            function GetValues() {
             
                    jQuery.support.cors = true;
                    $.ajax({
                        url: 'http://localhost:1731/api/Values/GetFull/?apikey=Aassdbcv&name=Mi nombre',
                        type: 'GET',
                        contentType: "text/xml;charset=utf-8",
                        success: function (data) {
                            alert(data);
                        },
                        error: function (error) {
                            alert('error: ' + error);
                        }
                    });
            }
        </script>

    <input id="Button1" type="button" value="button" onclick="javascript: GetValues();" /></div>

    He intentado con contentType: "application/json;charset=utf-8", y solo me muestra error.

    Por último, me gustaría tener la posibilidad de retornar los 2 formatos, xml y json para los metodos de un controller, ¿ es posible?, y ¿Como sería?.

    De antemano, agradezco vuestra ayuda.


    memo

    miércoles, 21 de noviembre de 2012 1:08

Respuestas

  • Buenas!

    Desde el punto de vista del controlador, lo tienes todo OK (entiendo que es un ApiController).

    La llamada que realizas en jQuery es lo que te falla ;-)

    El parámetro contentType indica el tipo de datos que tu ENVÍAS, no el que recibes. Para establecer el tipo de datos que tu esperas recibir (la cabecera accept de http) debes usar el parámetro dataType. Prueba a añadir este parámetro con valor "json" o "xml" en función de si quieres recibir json y xml.

    Otra opción, si quieres json es usar $.getJSON en lugar de $.Ajax, que es más cómodo.

    Y luego si me permites la sugerencia, estás usando la URL "a piñón" con los parámetros metidos en la querystring a saco. Para generar URLs de WebApi debes usar Url.Route:

    @Url.RouteUrl("DefaultApi", new { controller="Values", action="GetFull", apikey="Aassdbcv", name="Mi Nombre"});

    >Por último, me gustaría tener la posibilidad de retornar los 2 formatos, xml y json para los metodos de un controller, ¿ es posible?, y ¿Como sería?.

    No tienes que hacer nada. Esto está incluído de serie en WebApi y depende del valor de la cabecera accept de http.

    Un saludo!



    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis


    Muchas gracias por tú pronta respuesta y por lo que veo me hace mucha lógica, quisiera aprovecharme y preguntarte algo más. Eso significa que por cada acción que haga en el controller, debo poner los parámetros como en tú ejemplo? y por último, para no pasar todo por querystring, cuál sería la otra opción, ya que probé el ejemplo desde el code behind de un asp utilizando webclient y resultó, pero esa no es la idea, me gustaría poder implementarlo con JSon.

    Alguna sugerencia?, de antemano, muchas gracias.


    memo

    • Marcado como respuesta gcontreras miércoles, 28 de noviembre de 2012 20:04
    jueves, 22 de noviembre de 2012 17:22
  • Buenas!

    > para no pasar todo por querystring, cuál sería la otra opción, ya que probé el ejemplo desde el code behind de un asp utilizando webclient y resultó, pero esa no es la idea, me gustaría poder implementarlo con JSon.

    La otra opción es usar un POST (en lugar de un GET) y mandar los datos en el body. Puedes mandarlos en el formato clásico de POST (application/x-www-form-urlencoded) o bien en JSON (application/json). En ambos casos de WebApi puedes leerlos desde el controlador. Aunque ello ya requiere conocer un poco más como funciona el Model Binder de ASP.NET MVC (y WebApi) y no es para explicarlo en un foro ;-) Para un poco de info léete uno de los capítulos del manual de mvc que publiqué para los amigos de desarrolloweb: http://www.desarrolloweb.com/articulos/uso-post-aspnet-mvc-dotnet.html, en concreto el apartado "Model Binding". Se refiere a ASP.NET MVC pero WebApi usa el mismo Model Binder. Y el soporte para Json es automático (no debes hacer nada), tan solo mandar un objeto Json que sea "compatible" con la clase c# que esperas en el controlador y listos. Para más info consulta el post del blog de Enrique Ortuño: http://geeks.ms/blogs/eortuno/archive/2011/11/10/pasando-objetos-json-a-los-action-methods-en-mvc3.aspx (de nuevo es sobre MVC pero en WebApi aplica igual).

    Y si quieres ver como enviar JSON desde Javascript hace tiempo publiqué en mi blog un post al respecto: http://geeks.ms/blogs/etomas/archive/2010/11/23/trick-enviar-datos-en-json-usando-post.aspx

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta gcontreras miércoles, 28 de noviembre de 2012 20:04
    lunes, 26 de noviembre de 2012 16:19

Todas las respuestas

  • Buenas!

    Desde el punto de vista del controlador, lo tienes todo OK (entiendo que es un ApiController).

    La llamada que realizas en jQuery es lo que te falla ;-)

    El parámetro contentType indica el tipo de datos que tu ENVÍAS, no el que recibes. Para establecer el tipo de datos que tu esperas recibir (la cabecera accept de http) debes usar el parámetro dataType. Prueba a añadir este parámetro con valor "json" o "xml" en función de si quieres recibir json y xml.

    Otra opción, si quieres json es usar $.getJSON en lugar de $.Ajax, que es más cómodo.

    Y luego si me permites la sugerencia, estás usando la URL "a piñón" con los parámetros metidos en la querystring a saco. Para generar URLs de WebApi debes usar Url.Route:

    @Url.RouteUrl("DefaultApi", new { controller="Values", action="GetFull", apikey="Aassdbcv", name="Mi Nombre"});

    >Por último, me gustaría tener la posibilidad de retornar los 2 formatos, xml y json para los metodos de un controller, ¿ es posible?, y ¿Como sería?.

    No tienes que hacer nada. Esto está incluído de serie en WebApi y depende del valor de la cabecera accept de http.

    Un saludo!



    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis


    miércoles, 21 de noviembre de 2012 8:45
  • Buenas!

    Desde el punto de vista del controlador, lo tienes todo OK (entiendo que es un ApiController).

    La llamada que realizas en jQuery es lo que te falla ;-)

    El parámetro contentType indica el tipo de datos que tu ENVÍAS, no el que recibes. Para establecer el tipo de datos que tu esperas recibir (la cabecera accept de http) debes usar el parámetro dataType. Prueba a añadir este parámetro con valor "json" o "xml" en función de si quieres recibir json y xml.

    Otra opción, si quieres json es usar $.getJSON en lugar de $.Ajax, que es más cómodo.

    Y luego si me permites la sugerencia, estás usando la URL "a piñón" con los parámetros metidos en la querystring a saco. Para generar URLs de WebApi debes usar Url.Route:

    @Url.RouteUrl("DefaultApi", new { controller="Values", action="GetFull", apikey="Aassdbcv", name="Mi Nombre"});

    >Por último, me gustaría tener la posibilidad de retornar los 2 formatos, xml y json para los metodos de un controller, ¿ es posible?, y ¿Como sería?.

    No tienes que hacer nada. Esto está incluído de serie en WebApi y depende del valor de la cabecera accept de http.

    Un saludo!



    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis


    Muchas gracias por tú pronta respuesta y por lo que veo me hace mucha lógica, quisiera aprovecharme y preguntarte algo más. Eso significa que por cada acción que haga en el controller, debo poner los parámetros como en tú ejemplo? y por último, para no pasar todo por querystring, cuál sería la otra opción, ya que probé el ejemplo desde el code behind de un asp utilizando webclient y resultó, pero esa no es la idea, me gustaría poder implementarlo con JSon.

    Alguna sugerencia?, de antemano, muchas gracias.


    memo

    • Marcado como respuesta gcontreras miércoles, 28 de noviembre de 2012 20:04
    jueves, 22 de noviembre de 2012 17:22
  • Buenas!

    > para no pasar todo por querystring, cuál sería la otra opción, ya que probé el ejemplo desde el code behind de un asp utilizando webclient y resultó, pero esa no es la idea, me gustaría poder implementarlo con JSon.

    La otra opción es usar un POST (en lugar de un GET) y mandar los datos en el body. Puedes mandarlos en el formato clásico de POST (application/x-www-form-urlencoded) o bien en JSON (application/json). En ambos casos de WebApi puedes leerlos desde el controlador. Aunque ello ya requiere conocer un poco más como funciona el Model Binder de ASP.NET MVC (y WebApi) y no es para explicarlo en un foro ;-) Para un poco de info léete uno de los capítulos del manual de mvc que publiqué para los amigos de desarrolloweb: http://www.desarrolloweb.com/articulos/uso-post-aspnet-mvc-dotnet.html, en concreto el apartado "Model Binding". Se refiere a ASP.NET MVC pero WebApi usa el mismo Model Binder. Y el soporte para Json es automático (no debes hacer nada), tan solo mandar un objeto Json que sea "compatible" con la clase c# que esperas en el controlador y listos. Para más info consulta el post del blog de Enrique Ortuño: http://geeks.ms/blogs/eortuno/archive/2011/11/10/pasando-objetos-json-a-los-action-methods-en-mvc3.aspx (de nuevo es sobre MVC pero en WebApi aplica igual).

    Y si quieres ver como enviar JSON desde Javascript hace tiempo publiqué en mi blog un post al respecto: http://geeks.ms/blogs/etomas/archive/2010/11/23/trick-enviar-datos-en-json-usando-post.aspx

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta gcontreras miércoles, 28 de noviembre de 2012 20:04
    lunes, 26 de noviembre de 2012 16:19