Haciendo peticiones POST con Windows Phone

Hace poco un compañero me pedía que le ayudara porque estaba accediendo a una página que requería que se enviaran ciertos datos a una página web vía POST pero no tenía idea de cómo hacerlo con WebClient (y yo tampoco).  Decidí ponerme manos a las obras y a buscar en la red una forma de ayudar a mi compañero (y aprender algo nuevo en el camino), encontré muy poco material y en la mayoría sugieren utilizar HttpWebRequest y HttpWebResponse cosa que no quería hacer, así que aquí les dejo la respuesta que logré descubrir luego de tanto leer.

Para empezar creamos una función que nos permita hacer la petición, la misma recibirá los parámetros necesarios para preparar la cadena de datos de forma similar a la siguiente (yo por motivos de ejemplo obvié los parámetros ya que los escribo en código):

private void HacerPeticion()
{
  webClient = new WebClient();
  webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
  var uri = new Uri("http://localhost:8010/test.php", UriKind.Absolute);
  StringBuilder Datos = new StringBuilder();
  Datos.AppendFormat("{0}={1}&{2}={3}", "nombre", HttpUtility.UrlEncode("MiNombre"), "apellido", HttpUtility.UrlEncode("MiApellido")); 

  webClient.Headers[HttpRequestHeader.ContentLength] = Datos.Length.ToString();
  Debug.WriteLine(String.Format("Enviando {0} bytes", Datos.Length));
  webClient.UploadStringCompleted += new UploadStringCompletedEventHandler(webClient_UploadStringCompleted);
  Debug.WriteLine("Solicitando");
  webClient.UploadStringAsync(uri, "POST", Datos.ToString());
}

En Datos colocamos los datos que queremos enviar en el formato que utilizamos para peticiones GET. Y finalmente completamos el código del UploadStringCompleted como sigue:

void webClient_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
  Debug.WriteLine("Terminado");
  if (e.Error == null && !e.Cancelled)
    res.Text = e.Result;
  else
    res.Text = e.Error.Message;
}

Hecho esto podremos ver el resultado en un Textblock (que en mi caso se llama res). Una vez más les recuerdo que el código anterior no refleja las mejores prácticas porque está hecho para su mejor comprensión. Espero que le sea de ayuda, saludos.

Deja un comentario