C # как правильно выполнить HTTP-запрос GET

Я все еще новичок в c #, и я пытаюсь создать приложение для этой страницы, которое сообщит мне, когда я получу уведомление (ответил, прокомментировал и т. д.). Но пока я просто пытаюсь сделать простой вызов api, который получит данные пользователя.

Я использую Visual Studio express 2012 для создания приложения C #, где (на данный момент) вы вводите свой идентификатор пользователя, поэтому приложение сделает запрос с идентификатором пользователя и покажет статистику этого идентификатора пользователя.

вот код, где я пытаюсь сделать запрос:

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; } } } 

class является объектом и его доступ к нему из формы, просто разобрав его идентификатор пользователя и сделав запрос.

Я пробовал многие из примеров, которые я просмотрел в google, но не знаю, почему я получаю все это сообщение « ».

Я новичок в этом алгоритме, если кто-то может поделиться книгой или учебником, который показывает, как делать такие вещи (объясняя каждый шаг), я был бы признателен

Серверы иногда сжимают свои ответы, чтобы сэкономить на пропускной способности, когда это произойдет, вам нужно разложить ответ, прежде чем пытаться его прочитать. К счастью, платформа .NET может сделать это автоматически, однако мы должны включить эту настройку.

Вот пример того, как вы могли бы это достичь.

 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

Обновлено, чтобы выкинуть примеры, используя async для обоих запросов GET, а также POST


ПОЛУЧИТЬ

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

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

ПОСЛЕ
Содержит method параметров в случае, если вы хотите использовать другие HTTP-методы, такие как 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 async
Содержит method параметров в случае, если вы хотите использовать другие HTTP-методы, такие как 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(); } } 

Другой способ – использовать «HttpClient» следующим образом:

 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(); } } 
  • Насколько безопасно HTTP POST?
  • Повышение производительности многопоточных HttpWebRequests в .NET.
  • .NET: Можно ли заставить HttpWebRequest автоматически распаковывать ответы gzip'd?
  • Как игнорировать проверку сертификата, когда ssl
  • Как добавить параметры в WebRequest?
  • HttpWebResponse .NET распаковывает автоматически GZiped и Deflated ответы?
  • Сервер совершил нарушение протокола. Раздел = ResponseStatusLine ОШИБКА
  • Основная HTTP-аутентификация на iPhone
  • Могу ли я повторно использовать HttpWebRequest?
  • Получите HTTP-запросы и ответы, сделанные с помощью HttpWebRequest / HttpWebResponse, чтобы показать в Fiddler
  • Получение кода состояния Http (200, 301, 404 и т. Д.) Из HttpWebRequest и HttpWebResponse
  • Давайте будем гением компьютера.