Протокол HTTP. Класс HttpClient и HttpListener

Введение в протокол HTTP

Последнее обновление: 23.10.2022

В этой главе рассмотрим отправку запросов с помощью класса HttpClient. Но в начале вкратце посмотрим, что представляет протокол Http. HTTP (Hypertext Transfer Protocol) представляет протокол для запроса ресурсов с веб-сервера. Когда мы обращаемся в веб-браузере к каким-либо веб-сайтами, мы как раз используем протокол HTTP.

В .NET основной функционал по работе с протоколом HTTP сосредоточен в простанстве имен System.Net.Http, среди основных классов в котором следует отметить класс HttpClient (класс, который позволяет отправлять запросы к веб-ресурсам) и класс HttpListener, который выполняет роль веб-сервера. Но перед рассмотрением этих классов, следует вкратце рассмотреть базовые моменты протокола HTTP.

Методы HTTP

Когда клиент собирается сделать запрос на сервер, данный клиент должен определить метод ответа сервера на запрос. Метод HTTP описывает действия сервера при обработке запроса. Основные из этих методов:

  • OPTIONS: возвращает список остальных методов HTTP, которые поддерживает сервер для указанного адреса URL

  • TRACE: служебный метод, который просто повторяет исходный запрос, полученный сервером. Полезен для идентификации любых изменений, внесенных в запрос объектами в сети, пока запрос находится в пути.

  • CONNECT: устанавливают туннель TCP/IP между исходным хостом и удаленным хостом.

  • GET: извлекает копию ресурса по URL-адресу, на который был отправлен HTTP-запрос.

  • HEAD: так же как и GET, извлекает копию ресурса по URL, только ожидает получения одних заголовков без тела ответа

  • POST: предназначен для отправки данных в теле запроса для их сохранения в виде нового ресурса на сервере

  • PUT: предназначен для отправки данных в теле запроса для изменения уже имеющегося ресурса на сервере

  • PATCH: предназначен для отправки данных в теле запроса для частичного изменения уже имеющегося ресурса на сервереL

  • DELETE: предназначен для удаления ресурса по указанному адресу URL

В .NET для представления метода HTTP в пространстве имен System.Net.Http определен класс HttpMethod. Для определения в приложении запроса определенного типа класс предоставляет ряд статических свойств, который возвращают объект HttpMethod, представляющий определенный тип запросов:

  • HttpMethod.Delete

  • HttpMethod.Get

  • HttpMethod.Head

  • HttpMethod.Options

  • HttpMethod.Patch

  • HttpMethod.Post

  • HttpMethod.Put

  • HttpMethod.Trace

Если используется HTTP-метод, который не покрывается этими свойствами, то можно использовать конструктор, в который передается название метода:

HttpMethod customMethod = new HttpMethod("CUSTOM");

В дальнейшем мы будем использовать этот класс при отправке запросов к удаленным ресурсам.

Статусный код HTTP

При ответе сервер устанавливает статусный код HTTP, который указывает на статус обработки запроса. По умолчанию это 3-цифровой код, где первая цифра указывает на общий характер ответа, а вторая и третья цифра конкретизируют статус. Есть пять групп статусных кодов:

  • 1XX: информационные коды, которые указывают, что запрос получен, и его обработка продолжается

  • 2XX: коды, которые указывают на успешную обработку запроса

  • 3XX: коды переадресации

  • 4XX: коды, которые указывают, что запрос содержит ошибки. То есть ошибка возникла на стороне клиента, который отправил запрос

  • 5XX: коды, которые указывают, что в процессе обработки запроса возникла ошибка на сервере. То есть запрос от клиента корректен, а проблема на стороне сервера

В .NET за представление статусных кодов отвечает перечисление System.Net.HttpStatusCode, которое определяет для большинства статусных кодов соответствующие константы:

  • Accepted (представляет статусный код 202)

  • AlreadyReported (208)

  • Ambiguous (300)

  • BadGateway (502)

  • BadRequest (400)

  • Conflict (409)

  • Continue (100)

  • Created (201)

  • EarlyHints (103)

  • ExpectationFailed (417)

  • FailedDependency (424)

  • Forbidden (403)

  • Found (302)

  • GatewayTimeout (504)

  • Gone (410)

  • HttpVersionNotSupported (505)

  • IMUsed (226)

  • InsufficientStorage (507)

  • InternalServerError (500)

  • LengthRequired (411)

  • Locked (423)

  • LoopDetected (508)

  • MethodNotAllowed (405)

  • MisdirectedRequest (421)

  • Moved (301)

  • MovedPermanently (301)

  • MultipleChoices (300)

  • MultiStatus (207)

  • NetworkAuthenticationRequired (511)

  • NoContent (204)

  • NonAuthoritativeInformation (203)

  • NotAcceptable (406)

  • NotExtended (510)

  • NotFound (404)

  • NotImplemented (501)

  • NotModified (304)

  • OK (200)

  • PartialContent (206)

  • PaymentRequired (402)

  • PermanentRedirect (308)

  • PreconditionFailed (412)

  • PreconditionRequired (428)

  • Processing (102)

  • ProxyAuthenticationRequired (407)

  • Redirect (302)

  • RedirectKeepVerb (307)

  • RedirectMethod (303)

  • RequestedRangeNotSatisfiable (416)

  • RequestEntityTooLarge (413)

  • RequestHeaderFieldsTooLarge (431)

  • RequestTimeout (408)

  • RequestUriTooLong (414)

  • ResetContent (205)

  • SeeOther (303)

  • ServiceUnavailable (503)

  • SwitchingProtocols (101)

  • TemporaryRedirect (307)

  • TooManyRequests (429)

  • Unauthorized (401)

  • UnavailableForLegalReasons (451)

  • UnprocessableEntity (422)

  • UnsupportedMediaType (415)

  • Unused (306)

  • UpgradeRequired (426)

  • UseProxy (305)

  • VariantAlsoNegotiates (506)

Формат запроса и ответа

Формат запроса состоит из ряда компонентов. Прежде всего это линия запроса (request line), которая состоит из метода, пути к запрошенному ресурсу и специфической версии протокола, например:

GET /users/id/12 HTTP/1.1

Также запрос включает серию заголовков, например:

Accept: application/json

Опционально запрос может включать тело запроса, которое состоит из заголовков содержимого (предоставляют метаданные о типе содержимого), а также собственно содержимое.

Каждый сегмет в запросе отделен от другого символами \r\n - символом каретки и перевода на новую строку.

Пример запроса HTTP, определенный в виде строки C#:

var message = "GET / HTTP/1.1\r\n" +
              "Host: www.google.com\r\n" +
              "Connection: Close\r\n\r\n";

Содержимое данного HTTP-запроса указывает, что отправляется запрос GET по адресу "/" (то есть к корню веб-сайта), при этом применяется протокол HTTP/1.1. Далее определены два заголовка - "Host" со значением "www.google.com" и "Connection" со значением "Close".

Ответ сервера состоит из следующих компонентов:

  • Строка статуса с указанием конкретного протокола, статусного кода и сообщение статуса:

    HTTP/1.1 401 Bad Request

    В данном случае ответ содержит статусный код 401, то есть проблема на стороне клиента - в запросе отправлены некорректные данные

  • Заголовки ответа с метаданными, которые указывают, как парсить ответ

  • опционально тело ответа

информация о запросе и ответе приведена в большей степени для общего понимания, потому что в реальности, используя классы HttpClient и HttpListener, нам не придется напрягаться с определением формата запроса и ответа HTTP.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850