Cómo hacer una petición web HTTP POST

Canónico
¿Cómo puedo hacer una petición HTTP y enviar algunos datos utilizando el método POST?

Puedo hacer una petición GET pero no tengo ni idea de cómo hacer un POST.

Solución

Hay varias formas de realizar peticiones HTTP GET y POST:


Método A: HttpClient (Preferido)

Se trata de una envoltura alrededor de HttpWebRequest. Comparar con WebClient.

Disponible en: .NET Framework 4.5+, .NET Standard 1.1+, .NET Core 1.0+.

Actualmente el enfoque preferido. Asíncrono. Versión portátil para otras plataformas disponible a través de NuGet.

using System.Net.Http;

Setup

Es recomendable instanciar un HttpClient para toda la vida de tu aplicación y compartirlo.

private static readonly HttpClient client = new HttpClient();

Ver HttpClientFactory para una solución de Inyección de Dependencia.


  • POST

      var values = new Dictionary
      {
      { "cosa1", "hola" },
      { "cosa2", "mundo" }
      };
    
      var content = new FormUrlEncodedContent(values);
    
      var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content);
    
      var responseString = await response.Content.ReadAsStringAsync();
  • GET

      var responseString = await client.GetStringAsync("http://www.example.com/recepticle.aspx");

Método B: Bibliotecas de terceros

RestSharp

Biblioteca probada para interactuar con las APIs REST. Portátil. Disponible a través de NuGet.

Flurl.Http

Una biblioteca más reciente que cuenta con una API fluida y ayudantes de prueba. HttpClient bajo el capó. Portátil. Disponible a través de NuGet.

    usando Flurl.Http;

  • POST

      var responseString = await "http://www.example.com/recepticle.aspx"
          .PostUrlEncodedAsync(new { cosa1 = "hola", cosa2 = "mundo" })
          .ReceiveString();
  • GET

      var responseString = await "http://www.example.com/recepticle.aspx"
          .GetStringAsync();

Método C: HttpWebRequest (No se recomienda para trabajos nuevos)

Disponible en: .NET Framework 1.1+, .NET Standard 2.0+, .NET Core 1.0+

using System.Net;
using System.Text;  // for class Encoding
using System.IO;    // for StreamReader

  • POST

      var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");
    
      var postData = "thing1=" + Uri.EscapeDataString("hola");
          postData += "&thing2=" + Uri.EscapeDataString("mundo");
      var data = Encoding.ASCII.GetBytes(postData);
    
      request.Method = "POST";
      request.ContentType = "application/x-www-form-urlencoded";
      request.ContentLength = data.Length;
    
      using (var stream = request.GetRequestStream())
      {
          stream.Write(data, 0, data.Length);
      }
    
      var response = (HttpWebResponse)request.GetResponse();
    
      var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  • `GET'

      var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");
    
      var response = (HttpWebResponse)request.GetResponse();
    
      var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

Método D: WebClient (No se recomienda para trabajos nuevos)

Esta es una envoltura alrededor de HttpWebRequest. Comparar con HttpClient.

Disponible en: .NET Framework 1.1+, NET Standard 2.0+, .NET Core 2.0+

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

  • POST

      using (var client = new WebClient())
      {
          var values = new NameValueCollection();
          values["thing1"] = "hello";
          values["thing2"] = "world";
    
          var response = client.UploadValues("http://www.example.com/recepticle.aspx", values);
    
          var responseString = Encoding.Default.GetString(response);
      }
  • GET

      using (var client = new WebClient())
      {
          var responseString = client.DownloadString("http://www.example.com/recepticle.aspx");
      }
Comentarios (35)

Petición GET simple

using System.Net;

...

using (var wb = new WebClient())
{
    var response = wb.DownloadString(url);
}

Petición POST simple

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

...

using (var wb = new WebClient())
{
    var data = new NameValueCollection();
    data["username"] = "myUser";
    data["password"] = "myPassword";

    var response = wb.UploadValues(url, "POST", data);
    string responseInString = Encoding.UTF8.GetString(response);
}
Comentarios (12)

MSDN tiene un ejemplo.

using System;
using System.IO;
using System.Net;
using System.Text;

namespace Examples.System.Net
{
    public class WebRequestPostExample
    {
        public static void Main()
        {
            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create("http://www.contoso.com/PostAccepter.aspx");
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            string postData = "This is a test that posts this string to a Web server.";
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            // Display the content.
            Console.WriteLine(responseFromServer);
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
        }
    }
}
Comentarios (1)