c# HTTP

c# HTTP

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали о том, как работать с классом "MemoryStream" в C#. В данной статье я бы хотел рассказать, как работать с HTTP-протоколом в C#. Компьютеры взаимодействуют по сети, используя различные сетевые протоколы, определяющие форматы и способ передачи данных. В WEB основным протоколом является HTTP.

Различные куски программы могут взаимодействовать друг с другом по этому протоколу. Такая программа называется распределенной. Компоненты такой программы могут состоять из служб, каких-то сервисов, клиентов и располагаться на различных серверах. Для того, чтобы использовать данный протокол, можно воспользоваться классами из пространства имен "System.Net". В данном пространстве имен есть 2 абстрактных класса: "WebRequest" (запрос) и "WebResponse" (ответ). Как реализован механизм "Запрос-ответ": некий объект создаёт запрос и отправляет его на приёмник (можно назвать его сервером). Сервер принимает данные из запроса и отправляет ответ. Данные классы являются абстрактными, потому что данная схема используется не только протоколом HTTP, но и другими протоколами (ftp, file).

Разберем работу данного механизма на примере классов "HttpWebRequest" и "HttpWebResponse":

1) В первую очередь необходимо знать адрес сервиса или ресурса, на которой мы хотим обратиться. В начале адреса обычно идёт название протокола.

2) Создаём объект класса "HttpWebRequest".

3) Получаем объект класса "HttpWebResponse". Данный объект получается из объекта "HttpWebRequest" с использованием метода "GetResponse()". Как раз в тот момент, когда мы вызываем метод "GetResponse()", осуществляется запрос.

4) Анализируем код возврата, чтобы понять, что мы получили ответ. Необязательный шаг.

5) Анализируем полученные данные из потока через метод "GetResponseStream()".

Давайте на примере разберем, как создать запрос и получить ответ. Будем запрашивать ресурс и отображать его html-код:

using System;
using System.Text;
using System.IO;
using System.Net;
namespace TestApplicationForStudy
{
  class Program
  {
    static void Main(string[] args)
    {
      string uri = "https://yandex.ru";
      // Если адрес непустой, то делаем запрос к этому ресурсу
      if (!string.IsNullOrEmpty(uri))
      {
        HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
        if (request != null)
        {
          // Запрашиваем данные методом GET
          request.Method = "GET";
          HttpWebResponse response = request.GetResponse() as HttpWebResponse;
          // Будем определять кодировку из заголовка ответа "Content-Type"
          string encoding = "utf-8";
          string ct = response.Headers["Content-Type"];
          if (ct != null)
          {
            // После "charset=" идёт кодировка
            encoding = ct.Substring(ct.IndexOf("charset=") + 8);
          }
          // Создаём StreamReader, в котором читаем все данные из потока в нужной кодировке
          StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
          Console.WriteLine(reader.ReadToEnd());
          reader.Close();
        }
      }
      Console.ReadLine();
    }
  }
}

"WebRequest.Create(uri)" анализирует название протокола, которое записано в адресе и на основе этого создаёт объект подходящего класса. Оператор "as" используется для того, чтобы привести к нужному типу. Если приведение невозможно, то оператор "as" вернет "null".

Если мы запрашиваем ресурс, который требует аутентификации (ввода логина и пароля), то нужно использовать "NetworkCredential":

string username = "root";
string password = "12345";
request.Credentials = new NetworkCredential(username, password);

Для Windows-аутентификации используем "WindowsCredential".

В данной статье мы рассмотрели работу с HTTP-протоколом в C#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *