Nuestros programadores estrellas han agotado sus depósitos de café, investigando noche y día por la resolución, hasta que Marco halló el hallazgo en GitLab así que ahora la compartimos con nosotros.
Solución:
Hay varias formas de realizar HTTP GET
y POST
peticiones:
Método A: HttpClient (Preferido)
Disponible en: .NET Framework 4.5+
, .NET Standard 1.1+
, .NET Core 1.0+
.
Actualmente es el enfoque preferido y es asíncrono y de alto rendimiento. Utilice la versión integrada en la mayoría de los casos, pero para plataformas muy antiguas existe un paquete NuGet.
using System.Net.Http;
Configuración
Se recomienda instanciar uno HttpClient
durante la vigencia de su aplicación y compártala a menos que tenga una razón específica para no hacerlo.
private static readonly HttpClient client = new HttpClient();
Ver HttpClientFactory
para una solución de inyección de dependencia.
-
POST
var values = new Dictionary
"thing1", "hello" , "thing2", "world" ; 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
-
POST
var client = new RestClient("http://example.com"); // client.Authenticator = new HttpBasicAuthenticator(username, password); var request = new RestRequest("resource/id"); request.AddParameter("thing1", "Hello"); request.AddParameter("thing2", "world"); request.AddHeader("header", "value"); request.AddFile("file", path); var response = client.Post(request); var content = response.Content; // Raw content as string var response2 = client.Post
(request); var name = response2.Data.Name;
Flurl.Http
Es una biblioteca más nueva con una API fluida, ayudantes de prueba, utiliza HttpClient bajo el capó y es portátil. Está disponible a través de NuGet.
using 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();
Método C: HttpWebRequest (no recomendado para trabajos nuevos)
Disponible en: .NET Framework 1.1+
, .NET Standard 2.0+
, .NET Core 1.0+
. En .NET Core, es principalmente por compatibilidad: envuelve HttpClient
tiene menos rendimiento y no obtendrá nuevas funciones.
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();
Método D: WebClient (no recomendado para trabajos nuevos)
Este es un envoltorio alrededor 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");
Solicitud GET simple
using System.Net;
...
using (var wb = new WebClient())
var response = wb.DownloadString(url);
Solicitud POST sencilla
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);
MSDN tiene una muestra.
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();