Документация Python неофициальный перевод

http.client.md

400 строк · 32.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.4/library/http.client.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 21.12. [`http.client`](https://python-all.ru/3.4/library/http.client.html#module-http.client) – клиент протокола HTTP89**Исходный код:** [Lib/http/client.py](https://python-all.ru/src/3.4/Lib/http/client.py)1011---1213Этот модуль определяет классы, реализующие клиентскую сторону протоколов HTTP и HTTPS. Обычно он не используется напрямую – модуль [`urllib.request`](https://python-all.ru/3.4/library/urllib.request.html#module-urllib.request) применяет его для обработки URL, использующих HTTP и HTTPS.1415> **См. также**16>17> Для работы с HTTP на более высоком уровне рекомендуется [пакет Requests](https://python-all.ru/3.4/library/http.client.html).1819> **Примечание**20>21> Поддержка HTTPS доступна только в том случае, если Python был собран с поддержкой SSL (через модуль [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl)).2223Модуль предоставляет следующие классы:2425#### `class http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None)`2627Экземпляр [`HTTPConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection) представляет одну транзакцию с HTTP-сервером. При создании ему передаются имя хоста и необязательный номер порта. Если номер порта не указан, порт извлекается из строки хоста, если она имеет вид `host:port`; в противном случае используется порт HTTP по умолчанию (80). Если задан необязательный параметр *timeout*, блокирующие операции (например, попытки подключения) будут завершаться по тайм-ауту через указанное количество секунд (если параметр не задан, используется глобальная настройка тайм-аута по умолчанию). Необязательный параметр *source\_address* может быть кортежем (host, port), который будет использоваться в качестве исходного адреса для HTTP-соединения.2829Например, следующие вызовы создают экземпляры, подключающиеся к одному и тому же серверу по одному и тому же хосту и порту:3031```python32>>> h1 = http.client.HTTPConnection('www.python.org')33>>> h2 = http.client.HTTPConnection('www.python.org:80')34>>> h3 = http.client.HTTPConnection('www.python.org', 80)35>>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)36```3738Изменено в версии 3.2: Добавлен параметр *source\_address*.3940Изменено в версии 3.4: Параметр *strict* был удалён. Ответы в стиле HTTP 0.9 («простые ответы») больше не поддерживаются.4142#### `class http.client.HTTPSConnection(host, port=None, key_file=None, cert_file=None, [timeout, ]source_address=None, *, context=None, check_hostname=None)`4344Подкласс [`HTTPConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection), использующий SSL для связи с защищёнными серверами. Порт по умолчанию: `443`. Если указан *context*, он должен быть экземпляром [`ssl.SSLContext`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext), описывающим различные параметры SSL.4546*key\_file* и *cert\_file* устарели; вместо них используйте [`ssl.SSLContext.load_cert_chain()`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.load_cert_chain) или позвольте [`ssl.create_default_context()`](https://python-all.ru/3.4/library/ssl.html#ssl.create_default_context) выбрать доверенные сертификаты ЦС системы. Параметр *check\_hostname* также устарел; вместо него следует использовать атрибут [`ssl.SSLContext.check_hostname`](https://python-all.ru/3.4/library/ssl.html#ssl.SSLContext.check_hostname) объекта *context*.4748Пожалуйста, прочитайте [*Рекомендации по безопасности*](https://python-all.ru/3.4/library/ssl.html#ssl-security) для получения дополнительной информации о лучших практиках.4950Изменено в версии 3.2: Добавлены *source\_address*, *context* и *check\_hostname*.5152Изменено в версии 3.2: Теперь этот класс поддерживает виртуальные хосты HTTPS, если это возможно (то есть, если [`ssl.HAS_SNI`](https://python-all.ru/3.4/library/ssl.html#ssl.HAS_SNI) истинно).5354Изменено в версии 3.4: Параметр *strict* удалён. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.5556Изменено в версии 3.4.3: Теперь этот класс по умолчанию выполняет все необходимые проверки сертификата и имени хоста. Чтобы вернуться к предыдущему непроверенному поведению, параметру *context* можно передать `ssl._create_unverified_context()`.5758#### `class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)`5960Класс, экземпляры которого возвращаются при успешном соединении. Не создаётся напрямую пользователем.6162Изменено в версии 3.4: Параметр *strict* удалён. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.6364При необходимости генерируются следующие исключения:6566#### `exception http.client.HTTPException`6768Базовый класс остальных исключений этого модуля. Является подклассом [`Exception`](https://python-all.ru/3.4/library/exceptions.html#Exception).6970#### `exception http.client.NotConnected`7172Подкласс [`HTTPException`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPException).7374#### `exception http.client.InvalidURL`7576Подкласс [`HTTPException`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPException); возбуждается, если указан порт, но он не является числом или пуст.7778#### `exception http.client.UnknownProtocol`7980Подкласс [`HTTPException`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPException).8182#### `exception http.client.UnknownTransferEncoding`8384Подкласс [`HTTPException`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPException).8586#### `exception http.client.UnimplementedFileMode`8788Подкласс [`HTTPException`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPException).8990#### `exception http.client.IncompleteRead`9192Подкласс [`HTTPException`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPException).9394#### `exception http.client.ImproperConnectionState`9596Подкласс [`HTTPException`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPException).9798#### `exception http.client.CannotSendRequest`99100Подкласс [`ImproperConnectionState`](https://python-all.ru/3.4/library/http.client.html#http.client.ImproperConnectionState).101102#### `exception http.client.CannotSendHeader`103104Подкласс [`ImproperConnectionState`](https://python-all.ru/3.4/library/http.client.html#http.client.ImproperConnectionState).105106#### `exception http.client.ResponseNotReady`107108Подкласс [`ImproperConnectionState`](https://python-all.ru/3.4/library/http.client.html#http.client.ImproperConnectionState).109110#### `exception http.client.BadStatusLine`111112Подкласс [`HTTPException`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPException). Возникает, если сервер отвечает кодом состояния HTTP, который не удаётся распознать.113114#### `exception http.client.LineTooLong`115116Подкласс [`HTTPException`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPException). Возникает, если от сервера по протоколу HTTP получена строка чрезмерной длины.117118Константы, определённые в этом модуле:119120#### `http.client.HTTP_PORT`121122Порт по умолчанию для протокола HTTP (всегда `80`).123124#### `http.client.HTTPS_PORT`125126Порт по умолчанию для протокола HTTPS (всегда `443`).127128а также следующие константы для целочисленных кодов состояния:129130| Константа | Значение | Определение |131| --- | --- | --- |132| `CONTINUE` | `100` | HTTP/1.1, [RFC 2616, раздел 10.1.1](https://python-all.ru/3.4/library/http.client.html) |133| `SWITCHING_PROTOCOLS` | `101` | HTTP/1.1, [RFC 2616, раздел 10.1.2](https://python-all.ru/3.4/library/http.client.html) |134| `PROCESSING` | `102` | WEBDAV, [RFC 2518, раздел 10.1](https://python-all.ru/3.4/library/http.client.html) |135| `OK` | `200` | HTTP/1.1, [RFC 2616, раздел 10.2.1](https://python-all.ru/3.4/library/http.client.html) |136| `CREATED` | `201` | HTTP/1.1, [RFC 2616, раздел 10.2.2](https://python-all.ru/3.4/library/http.client.html) |137| `ACCEPTED` | `202` | HTTP/1.1, [RFC 2616, раздел 10.2.3](https://python-all.ru/3.4/library/http.client.html) |138| `NON_AUTHORITATIVE_INFORMATION` | `203` | HTTP/1.1, [RFC 2616, раздел 10.2.4](https://python-all.ru/3.4/library/http.client.html) |139| `NO_CONTENT` | `204` | HTTP/1.1, [RFC 2616, раздел 10.2.5](https://python-all.ru/3.4/library/http.client.html) |140| `RESET_CONTENT` | `205` | HTTP/1.1, [RFC 2616, раздел 10.2.6](https://python-all.ru/3.4/library/http.client.html) |141| `PARTIAL_CONTENT` | `206` | HTTP/1.1, [RFC 2616, раздел 10.2.7](https://python-all.ru/3.4/library/http.client.html) |142| `MULTI_STATUS` | `207` | WEBDAV [RFC 2518, раздел 10.2](https://python-all.ru/3.4/library/http.client.html) |143| `IM_USED` | `226` | Дельта-кодирование в HTTP, [**RFC 3229**](https://python-all.ru/3.4/library/http.client.html), раздел 10.4.1 |144| `MULTIPLE_CHOICES` | `300` | HTTP/1.1, [RFC 2616, раздел 10.3.1](https://python-all.ru/3.4/library/http.client.html) |145| `MOVED_PERMANENTLY` | `301` | HTTP/1.1, [RFC 2616, раздел 10.3.2](https://python-all.ru/3.4/library/http.client.html) |146| `FOUND` | `302` | HTTP/1.1, [RFC 2616, раздел 10.3.3](https://python-all.ru/3.4/library/http.client.html) |147| `SEE_OTHER` | `303` | HTTP/1.1, [RFC 2616, раздел 10.3.4](https://python-all.ru/3.4/library/http.client.html) |148| `NOT_MODIFIED` | `304` | HTTP/1.1, [RFC 2616, раздел 10.3.5](https://python-all.ru/3.4/library/http.client.html) |149| `USE_PROXY` | `305` | HTTP/1.1, [RFC 2616, раздел 10.3.6](https://python-all.ru/3.4/library/http.client.html) |150| `TEMPORARY_REDIRECT` | `307` | HTTP/1.1, [RFC 2616, раздел 10.3.8](https://python-all.ru/3.4/library/http.client.html) |151| `BAD_REQUEST` | `400` | HTTP/1.1, [RFC 2616, раздел 10.4.1](https://python-all.ru/3.4/library/http.client.html) |152| `UNAUTHORIZED` | `401` | HTTP/1.1, [RFC 2616, раздел 10.4.2](https://python-all.ru/3.4/library/http.client.html) |153| `PAYMENT_REQUIRED` | `402` | HTTP/1.1, [RFC 2616, раздел 10.4.3](https://python-all.ru/3.4/library/http.client.html) |154| `FORBIDDEN` | `403` | HTTP/1.1, [RFC 2616, раздел 10.4.4](https://python-all.ru/3.4/library/http.client.html) |155| `NOT_FOUND` | `404` | HTTP/1.1, [RFC 2616, раздел 10.4.5](https://python-all.ru/3.4/library/http.client.html) |156| `METHOD_NOT_ALLOWED` | `405` | HTTP/1.1, [RFC 2616, раздел 10.4.6](https://python-all.ru/3.4/library/http.client.html) |157| `NOT_ACCEPTABLE` | `406` | HTTP/1.1, [RFC 2616, раздел 10.4.7](https://python-all.ru/3.4/library/http.client.html) |158| `PROXY_AUTHENTICATION_REQUIRED` | `407` | HTTP/1.1, [RFC 2616, раздел 10.4.8](https://python-all.ru/3.4/library/http.client.html) |159| `REQUEST_TIMEOUT` | `408` | HTTP/1.1, [RFC 2616, раздел 10.4.9](https://python-all.ru/3.4/library/http.client.html) |160| `CONFLICT` | `409` | HTTP/1.1, [RFC 2616, раздел 10.4.10](https://python-all.ru/3.4/library/http.client.html) |161| `GONE` | `410` | HTTP/1.1, [RFC 2616, раздел 10.4.11](https://python-all.ru/3.4/library/http.client.html) |162| `LENGTH_REQUIRED` | `411` | HTTP/1.1, [RFC 2616, раздел 10.4.12](https://python-all.ru/3.4/library/http.client.html) |163| `PRECONDITION_FAILED` | `412` | HTTP/1.1, [RFC 2616, раздел 10.4.13](https://python-all.ru/3.4/library/http.client.html) |164| `REQUEST_ENTITY_TOO_LARGE` | `413` | HTTP/1.1, [RFC 2616, раздел 10.4.14](https://python-all.ru/3.4/library/http.client.html) |165| `REQUEST_URI_TOO_LONG` | `414` | HTTP/1.1, [RFC 2616, раздел 10.4.15](https://python-all.ru/3.4/library/http.client.html) |166| `UNSUPPORTED_MEDIA_TYPE` | `415` | HTTP/1.1, [RFC 2616, раздел 10.4.16](https://python-all.ru/3.4/library/http.client.html) |167| `REQUESTED_RANGE_NOT_SATISFIABLE` | `416` | HTTP/1.1, [RFC 2616, раздел 10.4.17](https://python-all.ru/3.4/library/http.client.html) |168| `EXPECTATION_FAILED` | `417` | HTTP/1.1, [RFC 2616, раздел 10.4.18](https://python-all.ru/3.4/library/http.client.html) |169| `UNPROCESSABLE_ENTITY` | `422` | WEBDAV, [RFC 2518, раздел 10.3](https://python-all.ru/3.4/library/http.client.html) |170| `LOCKED` | `423` | WEBDAV [RFC 2518, раздел 10.4](https://python-all.ru/3.4/library/http.client.html) |171| `FAILED_DEPENDENCY` | `424` | WEBDAV, [RFC 2518, раздел 10.5](https://python-all.ru/3.4/library/http.client.html) |172| `UPGRADE_REQUIRED` | `426` | Обновление HTTP до TLS, [**RFC 2817**](https://python-all.ru/3.4/library/http.client.html), раздел 6 |173| `PRECONDITION_REQUIRED` | `428` | Дополнительные коды состояния HTTP, [**RFC 6585**](https://python-all.ru/3.4/library/http.client.html), раздел 3 |174| `TOO_MANY_REQUESTS` | `429` | Дополнительные коды статуса HTTP, [**RFC 6585**](https://python-all.ru/3.4/library/http.client.html), раздел 4 |175| `REQUEST_HEADER_FIELDS_TOO_LARGE` | `431` | Дополнительные коды статуса HTTP, [**RFC 6585**](https://python-all.ru/3.4/library/http.client.html), раздел 5 |176| `INTERNAL_SERVER_ERROR` | `500` | HTTP/1.1, [RFC 2616, раздел 10.5.1](https://python-all.ru/3.4/library/http.client.html) |177| `NOT_IMPLEMENTED` | `501` | HTTP/1.1, [RFC 2616, раздел 10.5.2](https://python-all.ru/3.4/library/http.client.html) |178| `BAD_GATEWAY` | `502` | HTTP/1.1 [RFC 2616, раздел 10.5.3](https://python-all.ru/3.4/library/http.client.html) |179| `SERVICE_UNAVAILABLE` | `503` | HTTP/1.1, [RFC 2616, раздел 10.5.4](https://python-all.ru/3.4/library/http.client.html) |180| `GATEWAY_TIMEOUT` | `504` | HTTP/1.1 [RFC 2616, раздел 10.5.5](https://python-all.ru/3.4/library/http.client.html) |181| `HTTP_VERSION_NOT_SUPPORTED` | `505` | HTTP/1.1, [RFC 2616, раздел 10.5.6](https://python-all.ru/3.4/library/http.client.html) |182| `INSUFFICIENT_STORAGE` | `507` | WEBDAV, [RFC 2518, раздел 10.6](https://python-all.ru/3.4/library/http.client.html) |183| `NOT_EXTENDED` | `510` | Расширение HTTP Framework, [**RFC 2774**](https://python-all.ru/3.4/library/http.client.html), раздел 7 |184| `NETWORK_AUTHENTICATION_REQUIRED` | `511` | Дополнительные коды статуса HTTP, [**RFC 6585**](https://python-all.ru/3.4/library/http.client.html), раздел 6 |185186Изменено в версии 3.3: Добавлены коды `428`, `429`, `431` и `511` из [**RFC 6585**](https://python-all.ru/3.4/library/http.client.html).187188#### `http.client.responses`189190Этот словарь сопоставляет коды состояния HTTP 1.1 с названиями W3C.191192Пример: `http.client.responses[http.client.NOT_FOUND]` – это `'Not Found'`.193194## 21.12.1. Объекты HTTPConnection195196Экземпляры [`HTTPConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection) имеют следующие методы:197198#### `HTTPConnection.request(method, url, body=None, headers={})`199200Это отправляет запрос на сервер, используя метод HTTP *method* и селектор *url*.201202Если указан *body*, указанные данные отправляются после завершения заголовков. Он может быть строкой, [*байтоподобным объектом*](https://python-all.ru/3.4/glossary.html#term-bytes-like-object), открытым [*файловым объектом*](https://python-all.ru/3.4/glossary.html#term-file-object) или итерируемым объектом из [*байтоподобных объект*](https://python-all.ru/3.4/glossary.html#term-bytes-like-object)ов. Если *body* – строка, она кодируется как ISO-8851-1, кодировка по умолчанию для HTTP. Если это байтоподобный объект, байты отправляются как есть. Если это [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object), отправляется содержимое файла; этот файловый объект должен поддерживать как минимум метод `read()`. Если у файлового объекта есть атрибут `mode`, данные, возвращаемые методом `read()`, будут закодированы как ISO-8851-1, если только атрибут `mode` не содержит подстроку `b`; в противном случае данные, возвращаемые `read()`, отправляются как есть. Если *body* – итерируемый объект, элементы итерируемого объекта отправляются как есть до его исчерпания.203204Аргумент *headers* должен быть отображением дополнительных HTTP-заголовков, отправляемых вместе с запросом.205206Если *headers* не содержит элемент Content-Length, он добавляется автоматически, если это возможно. Если *body* равен `None`, заголовок Content-Length устанавливается в `0` для методов, которые ожидают тело (`PUT`, `POST` и `PATCH`). Если *body* – строка или байтовый объект, заголовок Content-Length устанавливается равным его длине. Если *body* является [*файловым объектом*](https://python-all.ru/3.4/glossary.html#term-file-object) и удаётся вызвать [`fstat()`](https://python-all.ru/3.4/library/os.html#os.fstat) для результата его метода `fileno()`, то заголовок Content-Length устанавливается равным `st_size`, возвращаемому вызовом `fstat`. В противном случае заголовок Content-Length не добавляется.207208Новое в версии 3.2: *body* теперь может быть итерируемым объектом.209210#### `HTTPConnection.getresponse()`211212Должен вызываться после отправки запроса для получения ответа от сервера. Возвращает экземпляр [`HTTPResponse`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPResponse).213214> **Примечание**215>216> Обратите внимание: необходимо прочитать весь ответ, прежде чем отправлять новый запрос на сервер.217218#### `HTTPConnection.set_debuglevel(level)`219220Устанавливает уровень отладки. Уровень отладки по умолчанию равен `0`, то есть отладочный вывод не производится. Любое значение больше `0` приведёт к выводу всех текущих определённых отладочных сообщений в stdout. `debuglevel` передаётся всем новым создаваемым объектам [`HTTPResponse`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPResponse).221222Новое в версии 3.1.223224#### `HTTPConnection.set_tunnel(host, port=None, headers=None)`225226Устанавливает хост и порт для HTTP Connect Tunnelling. Это позволяет пропускать соединение через прокси-сервер.227228Аргументы host и port задают конечную точку туннелированного соединения (т.е. адрес, включённый в запрос CONNECT, *а не* адрес прокси-сервера).229230Аргумент headers должен быть отображением дополнительных HTTP-заголовков, отправляемых вместе с запросом CONNECT.231232Например, чтобы установить туннель через прокси-сервер HTTPS, запущенный локально на порту 8080, нужно передать адрес прокси конструктору [`HTTPSConnection`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPSConnection), а адрес хоста, к которому в итоге требуется подключиться, – методу [`set_tunnel()`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection.set_tunnel):233234```python235>>> import http.client236>>> conn = http.client.HTTPSConnection("localhost", 8080)237>>> conn.set_tunnel("www.python.org")238>>> conn.request("HEAD","/index.html")239```240241Новое в версии 3.2.242243#### `HTTPConnection.connect()`244245Подключается к серверу, указанному при создании объекта.246247#### `HTTPConnection.close()`248249Закрывает соединение с сервером.250251В качестве альтернативы описанному выше методу `request()` можно отправлять запрос пошагово, используя четыре функции ниже.252253#### `HTTPConnection.putrequest(request, selector, skip_host=False, skip_accept_encoding=False)`254255Это должен быть первый вызов после установки соединения с сервером. Он отправляет серверу строку, состоящую из строки *request*, строки *selector* и версии HTTP (`HTTP/1.1`). Чтобы отключить автоматическую отправку заголовков `Host:` или `Accept-Encoding:` (например, для поддержки дополнительных кодировок содержимого), укажите *skip\_host* или *skip\_accept\_encoding* со значениями, отличными от False.256257#### `HTTPConnection.putheader(header, argument[, ...])`258259Отправляет заголовок в стиле [**RFC 822**](https://python-all.ru/3.4/library/http.client.html) на сервер. Он отправляет строку, состоящую из заголовка, двоеточия, пробела и первого аргумента. Если заданы дополнительные аргументы, отправляются строки продолжения, каждая из которых состоит из табуляции и аргумента.260261#### `HTTPConnection.endheaders(message_body=None)`262263Отправляет пустую строку серверу, сигнализируя об окончании заголовков. Необязательный аргумент *message\_body* можно использовать для передачи тела сообщения, связанного с запросом. Тело сообщения будет отправлено в том же пакете, что и заголовки, если оно является строкой; в противном случае оно отправляется в отдельном пакете.264265#### `HTTPConnection.send(data)`266267Send data to the server. This should be used directly only after the [`endheaders()`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection.endheaders) method has been called and before [`getresponse()`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPConnection.getresponse) is called.268269## 21.12.2. Объекты HTTPResponse270271Экземпляр [`HTTPResponse`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPResponse) инкапсулирует HTTP-ответ от сервера. Он предоставляет доступ к заголовкам запроса и телу сущности. Ответ является итерируемым объектом и может использоваться в операторе with.272273#### `HTTPResponse.read([amt])`274275Читает и возвращает тело ответа, или до следующих *amt* байт.276277#### `HTTPResponse.readinto(b)`278279Читает до следующих len(b) байт тела ответа в буфер *b*. Возвращает количество прочитанных байт.280281Новое в версии 3.3.282283#### `HTTPResponse.getheader(name, default=None)`284285Возвращает значение заголовка *name* или *default*, если нет заголовка, соответствующего *name*. Если существует более одного заголовка с именем *name*, возвращает все значения, объединённые через ', '. Если 'default' является любым итерируемым объектом, отличным от одной строки, его элементы аналогично возвращаются объединёнными запятыми.286287#### `HTTPResponse.getheaders()`288289Возвращает список кортежей (заголовок, значение).290291#### `HTTPResponse.fileno()`292293Возвращает `fileno` нижележащего сокета.294295#### `HTTPResponse.msg`296297Экземпляр `http.client.HTTPMessage`, содержащий заголовки ответа. `http.client.HTTPMessage` является подклассом [`email.message.Message`](https://python-all.ru/3.4/library/email.message.html#email.message.Message).298299#### `HTTPResponse.version`300301Версия протокола HTTP, используемая сервером. 10 для HTTP/1.0, 11 для HTTP/1.1.302303#### `HTTPResponse.status`304305Код состояния, возвращаемый сервером.306307#### `HTTPResponse.reason`308309Фраза причины, возвращаемая сервером.310311#### `HTTPResponse.debuglevel`312313Отладочный хук. Если [`debuglevel`](https://python-all.ru/3.4/library/http.client.html#http.client.HTTPResponse.debuglevel) больше нуля, сообщения будут выводиться в stdout по мере чтения и разбора ответа.314315#### `HTTPResponse.closed`316317Равно `True`, если поток закрыт.318319## 21.12.3. Примеры320321Ниже приведён пример сеанса, использующего метод `GET`:322323```python324>>> import http.client325>>> conn = http.client.HTTPSConnection("www.python.org")326>>> conn.request("GET", "/")327>>> r1 = conn.getresponse()328>>> print(r1.status, r1.reason)329200 OK330>>> data1 = r1.read()  # Возвращает всё содержимое.331>>> # Следующий пример демонстрирует чтение данных по частям.332>>> conn.request("GET", "/")333>>> r1 = conn.getresponse()334>>> while not r1.closed:335...     print(r1.read(200)) # 200 байт336b'<!doctype html>\n<!--[if"...337...338>>> # Пример некорректного запроса339>>> conn.request("GET", "/parrot.spam")340>>> r2 = conn.getresponse()341>>> print(r2.status, r2.reason)342404 Not Found343>>> data2 = r2.read()344>>> conn.close()345```346347Ниже приведён пример сеанса, использующего метод `HEAD`. Обратите внимание, что метод `HEAD` никогда не возвращает данные.348349```python350>>> import http.client351>>> conn = http.client.HTTPSConnection("www.python.org")352>>> conn.request("HEAD", "/")353>>> res = conn.getresponse()354>>> print(res.status, res.reason)355200 OK356>>> data = res.read()357>>> print(len(data))3580359>>> data == b''360True361```362363Ниже приведён пример сеанса, показывающий, как выполнять запросы `POST`:364365```python366>>> import http.client, urllib.parse367>>> params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})368>>> headers = {"Content-type": "application/x-www-form-urlencoded",369...            "Accept": "text/plain"}370>>> conn = http.client.HTTPConnection("bugs.python.org")371>>> conn.request("POST", "", params, headers)372>>> response = conn.getresponse()373>>> print(response.status, response.reason)374302 Found375>>> data = response.read()376>>> data377b'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'378>>> conn.close()379```380381Запросы `HTTP PUT` на стороне клиента очень похожи на запросы `POST`. Разница заключается только на стороне сервера, где HTTP-сервер разрешает создавать ресурсы с помощью запроса `PUT`. Следует отметить, что пользовательские методы HTTP +также обрабатываются в [`urllib.request.Request`](https://python-all.ru/3.4/library/urllib.request.html#urllib.request.Request) путём отправки соответствующего +атрибута method.Ниже приведён пример сеанса, показывающий, как выполнить `PUT` запрос с помощью http.client:382383```python384>>> # Это создаёт HTTP-сообщение.385>>> # с содержимым BODY в качестве вложенного представления386>>> # для ресурса http://localhost:8080/file387...388>>> import http.client389>>> BODY = "***filecontents***"390>>> conn = http.client.HTTPConnection("localhost", 8080)391>>> conn.request("PUT", "/file", BODY)392>>> response = conn.getresponse()393>>> print(response.status, response.reason)394200, OK395```396397## 21.12.4. Объекты HTTPMessage398399Экземпляр `http.client.HTTPMessage` содержит заголовки HTTP-ответа. Он реализован с помощью класса [`email.message.Message`](https://python-all.ru/3.4/library/email.message.html#email.message.Message).400