C # cómo hacer correctamente una solicitud GET web http

Todavía soy nuevo en c # y estoy intentando crear una aplicación para esta página que me avisará cuando reciba una notificación (contestada, comentada, etc.). Pero por ahora solo estoy tratando de hacer una simple llamada a la API que obtendrá los datos del usuario.

Estoy usando Visual Studio Express 2012 para comstackr la aplicación C #, donde (por ahora) ingresa su ID de usuario, por lo que la aplicación realizará la solicitud con la ID de usuario y mostrará las estadísticas de esta ID de usuario.

Aquí está el código donde estoy tratando de hacer la solicitud:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //Request library using System.Net; using System.IO; namespace TestApplication { class Connect { public string id; public string type; protected string api = "https://api.stackexchange.com/2.2/"; protected string options = "?order=desc&sort=name&site=stackoverflow"; public string request() { string totalUrl = this.join(id); return this.HttpGet(totalUrl); } protected string join(string s) { return api + type + "/" + s + options; } protected string get(string url) { try { string rt; WebRequest request = WebRequest.Create(url); WebResponse response = request.GetResponse(); Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); rt = reader.ReadToEnd(); Console.WriteLine(rt); reader.Close(); response.Close(); return rt; } catch(Exception ex) { return "Error: " + ex.Message; } } public string HttpGet(string URI) { WebClient client = new WebClient(); // Add a user agent header in case the // requested URI contains a query. client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); Stream data = client.OpenRead(URI); StreamReader reader = new StreamReader(data); string s = reader.ReadToEnd(); data.Close(); reader.Close(); return s; } } } 

la clase es un objeto y se accede a ella desde el formulario simplemente analizándolo con la identificación del usuario y realizando la solicitud.

He probado muchos de los ejemplos que he visto en google, pero no tengo idea de por qué recibo en todas las formas este mensaje ” “.

Soy nuevo en este tipo de algoritmo, si alguien puede compartir un libro o tutorial que muestre cómo hacer este tipo de cosas (explicando cada paso), lo apreciaría.

Los servidores a veces comprimen sus respuestas para ahorrar ancho de banda, cuando esto sucede, necesita descomprimir la respuesta antes de intentar leerla. Afortunadamente, el marco .NET puede hacer esto automáticamente, sin embargo, tenemos que activar la configuración.

Aquí hay un ejemplo de cómo podrías lograr eso.

 string html = string.Empty; string url = @"https://api.stackexchange.com/2.2/answers?order=desc&sort=activity&site=stackoverflow"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.AutomaticDecompression = DecompressionMethods.GZip; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { html = reader.ReadToEnd(); } Console.WriteLine(html); 

EDIT 23/11/17

Actualizado para desechar ejemplos usando async tanto para solicitudes GET como para POST


OBTENER

 public string Get(string uri) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using(Stream stream = response.GetResponseStream()) using(StreamReader reader = new StreamReader(stream)) { return reader.ReadToEnd(); } } 

Obtener async

 public async Task GetAsync(string uri) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; using(HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) using(Stream stream = response.GetResponseStream()) using(StreamReader reader = new StreamReader(stream)) { return await reader.ReadToEndAsync(); } } 

ENVIAR
Contiene el method del parámetro en el caso de que desee utilizar otros métodos HTTP como PUT, DELETE, ETC

 public string Post(string uri, string data, string contentType, string method = "POST") { byte[] dataBytes = Encoding.UTF8.GetBytes(data); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; request.ContentLength = dataBytes.Length; request.ContentType = contentType; request.Method = method; using(Stream requestBody = request.GetRequestStream()) { requestBody.Write(dataBytes, 0, dataBytes.Length); } using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using(Stream stream = response.GetResponseStream()) using(StreamReader reader = new StreamReader(stream)) { return reader.ReadToEnd(); } } 

Post asíncrono
Contiene el method del parámetro en el caso de que desee utilizar otros métodos HTTP como PUT, DELETE, ETC

 public async Task PostAsync(string uri, string data, string contentType, string method = "POST") { byte[] dataBytes = Encoding.UTF8.GetBytes(data); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; request.ContentLength = dataBytes.Length; request.ContentType = contentType; request.Method = method; using(Stream requestBody = request.GetRequestStream()) { await requestBody.WriteAsync(dataBytes, 0, dataBytes.Length); } using(HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) using(Stream stream = response.GetResponseStream()) using(StreamReader reader = new StreamReader(stream)) { return await reader.ReadToEndAsync(); } } 

Otra forma es usar ‘HttpClient’ de esta manera:

 using System; using System.Net; using System.Net.Http; namespace Test { class Program { static void Main(string[] args) { Console.WriteLine("Making API Call..."); using (var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate })) { client.BaseAddress = new Uri("https://api.stackexchange.com/2.2/"); HttpResponseMessage response = client.GetAsync("answers?order=desc&sort=activity&site=stackoverflow").Result; response.EnsureSuccessStatusCode(); string result = response.Content.ReadAsStringAsync().Result; Console.WriteLine("Result: " + result); } Console.ReadLine(); } } } 

HttpClient vs HttpWebRequest

 var request = (HttpWebRequest)WebRequest.Create("sendrequesturl"); var response = (HttpWebResponse)request.GetResponse(); string responseString; using (var stream = response.GetResponseStream()) { using (var reader = new StreamReader(stream)) { responseString = reader.ReadToEnd(); } }