none
Consumo de API REST RRS feed

  • Pregunta

  • Hola a todos, tengo una aplicación la cual está consumiendo servicios web realizados en arquitectura SOAP, con esto el consumo es correcto, pero ahora tengo un inconveniente con el consumo de servicios web realizados en REST estoy usando la libreria HTTPCLIENT, pero no he logrado realizar el consumo, alguien tiene algunos tutoriales o demás?

    Gracias por su ayuda.

    miércoles, 26 de julio de 2017 12:35

Respuestas

  • Particularmente no manejo muy bien aun la consumición de los servicios rest pero para practicar podrías probar primeramente algunos servicios web gratuitos como el de esta pagina que yo utilizo para practicas groupkt.com y seguir este tutorial servicios web rest con ejemplos post, get y deja descargar el proyecto con los métodos, existen muchas formas o ejemplos de como consumir pero para tener una base podría servirte, probé el método get y funciona

    protected void Page_Load(object sender, EventArgs e)
            {
       string UrlBase = "http://services.groupkt.com/country/search";
                Dictionary<string, string> Parametros = new Dictionary<string, string>();
                Parametros.Add("text", "in");//parametros a buscar
    
                var resultado = GetResponse_GET(UrlBase, Parametros);
                Response.Write(resultado.ToString());
            }
    private static string ConcatParams(Dictionary<string, string> parameters)
            {
                bool FirstParam = true;
                StringBuilder Parametros = null;
    
                if (parameters != null)
                {
                    Parametros = new StringBuilder();
                    foreach (KeyValuePair<string, string> param in parameters)
                    {
                        Parametros.Append(FirstParam ? "" : "&");
                        Parametros.Append(param.Key + "=" + System.Web.HttpUtility.UrlEncode(param.Value));
                        FirstParam = false;
                    }
                }
    
                return Parametros == null ? string.Empty : Parametros.ToString();
            }
    public static string GetResponse_GET(string url, Dictionary<string, string> parameters)
            {
                try{
                    //Concatenamos los parametros, OJO: antes del primero debe estar el caracter "?"
                    string parametrosConcatenados = ConcatParams(parameters);
                    string urlConParametros = url + "?" + parametrosConcatenados;
    
                    System.Net.WebRequest wr = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(urlConParametros);
                    wr.Method = "GET";
    
                    wr.ContentType = "application/x-www-form-urlencoded";
    
                    System.IO.Stream newStream;
                    // Obtiene la respuesta
                    System.Net.WebResponse response = wr.GetResponse();
                    // Stream con el contenido recibido del servidor
                    newStream = response.GetResponseStream();
                    System.IO.StreamReader reader = new System.IO.StreamReader(newStream);
                    // Leemos el contenido
                    string responseFromServer = reader.ReadToEnd();
    
                    // Cerramos los streams
                    reader.Close();
                    newStream.Close();
                    response.Close();
                    return responseFromServer;
                }
                catch (System.Web.HttpException ex)
                {
                    if (ex.ErrorCode == 404)
                        throw new Exception("Not found remote service " + url);
                    else throw ex;
                }
            }

    resultado en el navegador, si quieres obtener los datos y manejarlos tendrias que crear clases y maperlo

    por ultimo algo que te ayudaría seria el postman donde puedes realizar consultas al servicio web, obtienes resultados y donde dice code te genera los codigos de la consulta en distintos lenguajes

    Espero te sea de ayuda.

    Saludos.

    • Marcado como respuesta Felipe Suarez jueves, 27 de julio de 2017 18:35
    miércoles, 26 de julio de 2017 19:00

Todas las respuestas

  • hola

    Recibes algun mensaje de error cuando invocas el servicio rest ? Estas creado con asp.net mvc webapi?

    Puedes validar que el host que expone el servicio esta iniciado, o sea si estan los proyectos en el misma solucion valida que el iis express este iniciado, salvo que este invocando el servicio deployado en un ambiente

    Calling a Web API From a .NET Client (C#)

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina



    miércoles, 26 de julio de 2017 13:24
  • Hola Leandro, estoy usando este método

    using (var client = new HttpClient())
                {
                    client.BaseAddress = new Uri("http://127.0.0.1:8000/api/");
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    HttpResponseMessage response;

                    // HTTP POST
                    response = await client.PostAsync("backend/listarOrientador?salePoint=50010&tokenApi=123456");
                    if (response.IsSuccessStatusCode)
                    {
                        lblKioscoCode.Text = response + "";
                    }
                }

    Pero me esta saliendo error en await client.PostAsync, dice que estoy haciendo mal el llamado del metodo

    miércoles, 26 de julio de 2017 13:31
  • hola

    >>Pero me esta saliendo error en await client.PostAsync, dice que estoy haciendo mal el llamado del metodo

    cual es el mensaje exacto que recibes ?

    veo que defienes application/json, pero no veo que asignes ninguno, porque pasas los valores en la url en lugar de enviarlos como datos en el post?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 26 de julio de 2017 14:02
  • Leí lo que me pasaste, ahora mi método es así

    public async void getUserByKiosc(string salePoint, string tokenApi)
            {
                client.BaseAddress = new Uri("http://127.0.0.1:8000/api/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                HttpResponseMessage response = await client.PostAsJsonAsync("backend/listarOrientador", salePoint + "&" + tokenApi);
                if (response.IsSuccessStatusCode)
                {
                    lblKioscoCode.Text = response.Headers.Location + "";
                }
            }

    Esta bien pasar así los datos post?

    Una operación asincrónica no se puede comenzar en este momento. Solo se pueden comenzar operaciones asincrónicas dentro de un controlador o módulo asincrónico o durante ciertos eventos en el ciclo de vida de la página. Si esta excepción se produjo mientras se ejecutaba una página, asegúrese de que la página esté marcada con <%@ Page Async="true" %>. Esta excepción puede también indicar que se intentó llamar a un método "async void" que generalmente no es compatible con el procesamiento de solicitudes de ASP.NET. En su lugar, el método asincrónico debería devolver una Tarea y el llamador debería esperarla.

    miércoles, 26 de julio de 2017 14:10
  • Particularmente no manejo muy bien aun la consumición de los servicios rest pero para practicar podrías probar primeramente algunos servicios web gratuitos como el de esta pagina que yo utilizo para practicas groupkt.com y seguir este tutorial servicios web rest con ejemplos post, get y deja descargar el proyecto con los métodos, existen muchas formas o ejemplos de como consumir pero para tener una base podría servirte, probé el método get y funciona

    protected void Page_Load(object sender, EventArgs e)
            {
       string UrlBase = "http://services.groupkt.com/country/search";
                Dictionary<string, string> Parametros = new Dictionary<string, string>();
                Parametros.Add("text", "in");//parametros a buscar
    
                var resultado = GetResponse_GET(UrlBase, Parametros);
                Response.Write(resultado.ToString());
            }
    private static string ConcatParams(Dictionary<string, string> parameters)
            {
                bool FirstParam = true;
                StringBuilder Parametros = null;
    
                if (parameters != null)
                {
                    Parametros = new StringBuilder();
                    foreach (KeyValuePair<string, string> param in parameters)
                    {
                        Parametros.Append(FirstParam ? "" : "&");
                        Parametros.Append(param.Key + "=" + System.Web.HttpUtility.UrlEncode(param.Value));
                        FirstParam = false;
                    }
                }
    
                return Parametros == null ? string.Empty : Parametros.ToString();
            }
    public static string GetResponse_GET(string url, Dictionary<string, string> parameters)
            {
                try{
                    //Concatenamos los parametros, OJO: antes del primero debe estar el caracter "?"
                    string parametrosConcatenados = ConcatParams(parameters);
                    string urlConParametros = url + "?" + parametrosConcatenados;
    
                    System.Net.WebRequest wr = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(urlConParametros);
                    wr.Method = "GET";
    
                    wr.ContentType = "application/x-www-form-urlencoded";
    
                    System.IO.Stream newStream;
                    // Obtiene la respuesta
                    System.Net.WebResponse response = wr.GetResponse();
                    // Stream con el contenido recibido del servidor
                    newStream = response.GetResponseStream();
                    System.IO.StreamReader reader = new System.IO.StreamReader(newStream);
                    // Leemos el contenido
                    string responseFromServer = reader.ReadToEnd();
    
                    // Cerramos los streams
                    reader.Close();
                    newStream.Close();
                    response.Close();
                    return responseFromServer;
                }
                catch (System.Web.HttpException ex)
                {
                    if (ex.ErrorCode == 404)
                        throw new Exception("Not found remote service " + url);
                    else throw ex;
                }
            }

    resultado en el navegador, si quieres obtener los datos y manejarlos tendrias que crear clases y maperlo

    por ultimo algo que te ayudaría seria el postman donde puedes realizar consultas al servicio web, obtienes resultados y donde dice code te genera los codigos de la consulta en distintos lenguajes

    Espero te sea de ayuda.

    Saludos.

    • Marcado como respuesta Felipe Suarez jueves, 27 de julio de 2017 18:35
    miércoles, 26 de julio de 2017 19:00
  • Gracias por tu ayuda, probe lo que me pasaste y me funciono perfectamente, era lo que necesitaba.

    Saludos.

    jueves, 27 de julio de 2017 18:36