.NET: la forma más simple de enviar POST con datos y leer la respuesta

Para mi sorpresa, no puedo hacer nada tan simple como esto, por lo que puedo decir, en .NET BCL:

byte[] response = Http.Post ( url: "http://dork.com/service", contentType: "application/x-www-form-urlencoded", contentLength: 32, content: "home=Cosby&favorite+flavor=flies" ); 

Este código hipotético anterior hace un HTTP POST, con datos, y devuelve la respuesta de un método Post en una clase estática Http .

Dado que nos quedamos sin algo tan fácil, ¿cuál es la siguiente mejor solución?

¿Cómo envío un HTTP POST con datos Y obtengo el contenido de la respuesta?

  using (WebClient client = new WebClient()) { byte[] response = client.UploadValues("http://dork.com/service", new NameValueCollection() { { "home", "Cosby" }, { "favorite+flavor", "flies" } }); string result = System.Text.Encoding.UTF8.GetString(response); } 

Necesitarás estos incluye:

 using System; using System.Collections.Specialized; using System.Net; 

Si insiste en usar un método / clase estático:

 public static class Http { public static byte[] Post(string uri, NameValueCollection pairs) { byte[] response = null; using (WebClient client = new WebClient()) { response = client.UploadValues(uri, pairs); } return response; } } 

Entonces simplemente:

 var response = Http.Post("http://dork.com/service", new NameValueCollection() { { "home", "Cosby" }, { "favorite+flavor", "flies" } }); 

Usando HttpClient: en lo que concierne al desarrollo de aplicaciones de Windows 8, me encontré con esto.

 var client = new HttpClient(); var pairs = new List> { new KeyValuePair("pqpUserName", "admin"), new KeyValuePair("password", "test@123") }; var content = new FormUrlEncodedContent(pairs); var response = client.PostAsync("youruri", content).Result; if (response.IsSuccessStatusCode) { } 

Use WebRequest . De Scott Hanselman :

 public static string HttpPost(string URI, string Parameters) { System.Net.WebRequest req = System.Net.WebRequest.Create(URI); req.Proxy = new System.Net.WebProxy(ProxyString, true); //Add these, as we're doing a POST req.ContentType = "application/x-www-form-urlencoded"; req.Method = "POST"; //We need to count how many bytes we're sending. //Post'ed Faked Forms should be name=value& byte [] bytes = System.Text.Encoding.ASCII.GetBytes(Parameters); req.ContentLength = bytes.Length; System.IO.Stream os = req.GetRequestStream (); os.Write (bytes, 0, bytes.Length); //Push it out there os.Close (); System.Net.WebResponse resp = req.GetResponse(); if (resp== null) return null; System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()); return sr.ReadToEnd().Trim(); } 
 private void PostForm() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dork.com/service"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; string postData ="home=Cosby&favorite+flavor=flies"; byte[] bytes = Encoding.UTF8.GetBytes(postData); request.ContentLength = bytes.Length; Stream requestStream = request.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); WebResponse response = request.GetResponse(); Stream stream = response.GetResponseStream(); StreamReader reader = new StreamReader(stream); var result = reader.ReadToEnd(); stream.Dispose(); reader.Dispose(); } 

Personalmente, creo que el enfoque más simple para hacer una publicación http y obtener la respuesta es usar la clase WebClient. Esta clase abstrae muy bien los detalles. Incluso hay un ejemplo de código completo en la documentación de MSDN.

http://msdn.microsoft.com/en-us/library/system.net.webclient(VS.80).aspx

En tu caso, quieres el método UploadData (). (Nuevamente, se incluye una muestra de código en la documentación)

http://msdn.microsoft.com/en-us/library/tdbbwh0a(VS.80).aspx

UploadString () probablemente también funcione y lo abstraiga un nivel más.

http://msdn.microsoft.com/en-us/library/system.net.webclient.uploadstring(VS.80).aspx

Sé que este es un hilo viejo, pero espero que ayude a alguien.

 public static void SetRequest(string mXml) { HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.CreateHttp("http://dork.com/service"); webRequest.Method = "POST"; webRequest.Headers["SOURCE"] = "WinApp"; // Decide your encoding here //webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.ContentType = "text/xml; charset=utf-8"; // You should setContentLength byte[] content = System.Text.Encoding.UTF8.GetBytes(mXml); webRequest.ContentLength = content.Length; var reqStream = await webRequest.GetRequestStreamAsync(); reqStream.Write(content, 0, content.Length); var res = await httpRequest(webRequest); } 

Puedes usar algo como este pseudo código:

 request = System.Net.HttpWebRequest.Create(your url) request.Method = WebRequestMethods.Http.Post writer = New System.IO.StreamWriter(request.GetRequestStream()) writer.Write("your data") writer.Close() response = request.GetResponse() reader = New System.IO.StreamReader(response.GetResponseStream()) responseText = reader.ReadToEnd