Hoe maak je een HTTP POST web verzoek

Canonical
Hoe kan ik een HTTP verzoek doen en data versturen met de POST methode?

Ik kan een GET verzoek doen, maar ik heb geen idee hoe ik een POST verzoek moet doen.

Oplossing

Er zijn verschillende manieren om HTTP GET en POST verzoeken uit te voeren:


Methode A: HttpClient (Voorkeur)

Dit is een wrapper rond HttpWebRequest. Vergelijk met WebClient.

Beschikbaar in: .NET Framework 4.5+, .NET Standard 1.1+, .NET Core 1.0+ .

Momenteel de voorkeursaanpak. Asynchroon. Portable versie voor andere platformen beschikbaar via NuGet.

using System.Net.Http;

Setup

Het is aanbevolen om één HttpClient te instantiëren voor uw applicatie's levensduur en deze te delen.

private static readonly HttpClient client = new HttpClient();

Zie HttpClientFactory voor een Dependency Injection oplossing.


  • POST

      var values = new Dictionary
      {
      { "thing1", "hello" },
      { "thing2", "world" } }, { "thing2", "world" }
      };
    
      var content = new FormUrlEncodedContent(waarden);
    
      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");

Methode B: 3rd-Party Bibliotheken

Beproefde en geteste bibliotheek voor interactie met REST API's. Draagbaar. Beschikbaar via NuGet.

Nieuwere bibliotheek met een vloeiende API en test helpers. HttpClient onder de motorkap. Draagbaar. Beschikbaar via NuGet.

    met Flurl.Http;

  • POST

      var responseString = await "http://www.example.com/recepticle.aspx"
          .PostUrlEncodedAsync(new { thing1 = "hello", thing2 = "world" })
          .ReceiveString();
  • GET

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

Methode C: HttpWebRequest (Niet aanbevolen voor nieuw werk)

Beschikbaar in: .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("hello");
          postData += "&thing2=" + Uri.EscapeDataString("world");
      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();

Methode D: WebClient (Niet aanbevolen voor nieuw werk)

Dit is een wrapper rond HttpWebRequest. Vergelijk met HttpClient.

Beschikbaar in: .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");
      }
Commentaren (35)

Eenvoudig GET verzoek

using System.Net;

...

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

Eenvoudig POST verzoek

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);
}
Commentaren (12)

MSDN heeft een voorbeeld.

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();
        }
    }
}
Commentaren (1)