http.client.md
1> **Источник:** https://python-all.ru/3.15/library/http.client.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `http.client` – клиент протокола HTTP89**Исходный код:** [Lib/http/client.py](https://python-all.ru/src/3.15/Lib/http/client.py)1011---1213Этот модуль определяет классы, реализующие клиентскую часть протоколов HTTP и HTTPS. Обычно он не используется напрямую – модуль [`urllib.request`](https://python-all.ru/3.15/library/urllib.request.html#module-urllib.request) применяет его для обработки URL, использующих HTTP и HTTPS.1415> **См. также**16>17> Для высокоуровневого интерфейса HTTP-клиента рекомендуется [пакет Requests](https://python-all.ru/3.15/library/http.client.html).1819> **Примечание**20>21> Поддержка HTTPS доступна только при компиляции Python с поддержкой SSL (через модуль [`ssl`](https://python-all.ru/3.15/library/ssl.html#module-ssl)).2223[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.2425Этот модуль не работает или недоступен на WebAssembly. Подробнее см. [платформы WebAssembly](https://python-all.ru/3.15/library/intro.html#wasm-availability).2627Модуль предоставляет следующие классы:2829#### `class http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None, blocksize=8192, max_response_headers=None)`3031Экземпляр `HTTPConnection` представляет одну транзакцию с HTTP-сервером. Его следует создавать (или экземпляр создаётся) путём передачи хоста и необязательного номера порта. Если номер порта не указан, порт извлекается из строки хоста, если она имеет форму `host:port`, иначе используется порт HTTP по умолчанию (80). Если указан необязательный параметр *таймаут*, блокирующие операции (например, попытки подключения) будут завершаться по таймауту через указанное количество секунд (если параметр не указан, используется глобальная настройка таймаута по умолчанию). Необязательный параметр *source\_address* может быть кортежем (host, port), который используется в качестве исходного адреса для HTTP-соединения. Необязательный параметр *blocksize* задаёт размер буфера в байтах для отправки тела сообщения в виде файлового объекта. Необязательный параметр *max\_response\_headers* задаёт максимальное количество разрешённых заголовков ответа для предотвращения атак типа «отказ в обслуживании»; в противном случае используется значение по умолчанию (100).3233Например, следующие вызовы создают экземпляры, подключающиеся к одному и тому же серверу по одному и тому же хосту и порту:3435```python36>>> h1 = http.client.HTTPConnection('www.python.org')37>>> h2 = http.client.HTTPConnection('www.python.org:80')38>>> h3 = http.client.HTTPConnection('www.python.org', 80)39>>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)40```4142Изменено в версии 3.2: Добавлен параметр *source\_address*.4344Изменено в версии 3.4: Параметр *strict* удалён. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.4546Изменено в версии 3.7: Добавлен параметр *blocksize*.4748Изменено в версии 3.15: был добавлен параметр *max\_response\_headers*.4950#### `class http.client.HTTPSConnection(host, port=None, *, [timeout, ]source_address=None, context=None, blocksize=8192, max_response_headers=None)`5152Подкласс [`HTTPConnection`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPConnection), использующий SSL для связи с защищёнными серверами. Порт по умолчанию – `443`. Если указан *context*, он должен быть экземпляром [`ssl.SSLContext`](https://python-all.ru/3.15/library/ssl.html#ssl.SSLContext), описывающим различные параметры SSL.5354Пожалуйста, прочитайте [Рекомендации по безопасности](https://python-all.ru/3.15/library/ssl.html#ssl-security) для получения дополнительной информации о лучших практиках.5556Изменено в версии 3.2: Добавлены *source\_address*, *context* и *check\_hostname*.5758Изменено в версии 3.2: Теперь этот класс поддерживает виртуальные хосты HTTPS (если [`ssl.HAS_SNI`](https://python-all.ru/3.15/library/ssl.html#ssl.HAS_SNI) истинно).5960Изменено в версии 3.4: Параметр *strict* удалён. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.6162Изменено в версии 3.4.3: Теперь этот класс по умолчанию выполняет все необходимые проверки сертификата и имени хоста. Чтобы вернуть прежнее непроверенное поведение, можно передать `ssl._create_unverified_context()` параметру *context*.6364Изменено в версии 3.8: Теперь этот класс включает TLS 1.3 [`ssl.SSLContext.post_handshake_auth`](https://python-all.ru/3.15/library/ssl.html#ssl.SSLContext.post_handshake_auth) для *context* по умолчанию или при передаче *cert\_file* с пользовательским *context*.6566Изменено в версии 3.10: Теперь этот класс отправляет расширение ALPN с индикатором протокола `http/1.1`, если не задан *context*. Пользовательский *context* должен устанавливать протоколы ALPN с помощью [`set_alpn_protocols()`](https://python-all.ru/3.15/library/ssl.html#ssl.SSLContext.set_alpn_protocols).6768Изменено в версии 3.12: Устаревшие параметры *key\_file*, *cert\_file* и *check\_hostname* удалены.6970Изменено в версии 3.15: был добавлен параметр *max\_response\_headers*.7172#### `class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)`7374Класс, экземпляры которого возвращаются при успешном соединении. Не создаётся напрямую пользователем.7576Изменено в версии 3.4: Параметр *strict* удалён. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.7778Модуль предоставляет следующую функцию:7980#### `http.client.parse_headers(fp)`8182Разбирает заголовки из файлового указателя *fp*, представляющего HTTP-запрос или ответ. Файл должен быть читателем [`BufferedIOBase`](https://python-all.ru/3.15/library/io.html#io.BufferedIOBase) (то есть не текстовым) и содержать корректные заголовки в стиле [**RFC 5322**](https://python-all.ru/3.15/library/http.client.html).8384Эта функция возвращает экземпляр [`http.client.HTTPMessage`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPMessage), который содержит поля заголовка, но не тело (аналогично [`HTTPResponse.msg`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPResponse.msg) и [`http.server.BaseHTTPRequestHandler.headers`](https://python-all.ru/3.15/library/http.server.html#http.server.BaseHTTPRequestHandler.headers)). После возврата файловый указатель *fp* готов к чтению тела HTTP.8586> **Примечание**87>88> `parse_headers()` не разбирает стартовую строку HTTP-сообщения; он разбирает только строки `Name: value`. Файл должен быть готов к чтению этих строк полей, поэтому перед вызовом функции первая строка уже должна быть потреблена.8990При необходимости генерируются следующие исключения:9192#### `exception http.client.HTTPException`9394Базовый класс остальных исключений в этом модуле. Является подклассом [`Exception`](https://python-all.ru/3.15/library/exceptions.html#Exception).9596#### `exception http.client.NotConnected`9798Подкласс [`HTTPException`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPException).99100#### `exception http.client.InvalidURL`101102Подкласс [`HTTPException`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPException), возбуждается, если указан порт, который не является числом или пуст.103104#### `exception http.client.UnknownProtocol`105106Подкласс [`HTTPException`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPException).107108#### `exception http.client.UnknownTransferEncoding`109110Подкласс [`HTTPException`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPException).111112#### `exception http.client.UnimplementedFileMode`113114Подкласс [`HTTPException`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPException).115116#### `exception http.client.IncompleteRead`117118Подкласс [`HTTPException`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPException).119120#### `exception http.client.ImproperConnectionState`121122Подкласс [`HTTPException`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPException).123124#### `exception http.client.CannotSendRequest`125126Подкласс [`ImproperConnectionState`](https://python-all.ru/3.15/library/http.client.html#http.client.ImproperConnectionState).127128#### `exception http.client.CannotSendHeader`129130Подкласс [`ImproperConnectionState`](https://python-all.ru/3.15/library/http.client.html#http.client.ImproperConnectionState).131132#### `exception http.client.ResponseNotReady`133134Подкласс [`ImproperConnectionState`](https://python-all.ru/3.15/library/http.client.html#http.client.ImproperConnectionState).135136#### `exception http.client.BadStatusLine`137138Подкласс [`HTTPException`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPException). Возбуждается, если сервер отвечает HTTP-кодом состояния, который не распознаётся.139140#### `exception http.client.LineTooLong`141142Подкласс [`HTTPException`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPException). Возбуждается, если от сервера по протоколу HTTP получена чрезмерно длинная строка.143144#### `exception http.client.RemoteDisconnected`145146Подкласс [`ConnectionResetError`](https://python-all.ru/3.15/library/exceptions.html#ConnectionResetError) и [`BadStatusLine`](https://python-all.ru/3.15/library/http.client.html#http.client.BadStatusLine). Возбуждается [`HTTPConnection.getresponse()`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPConnection.getresponse), когда при попытке чтения ответа из соединения не получено данных, что указывает на закрытие соединения удалённой стороной.147148Добавлено в версии 3.5: Ранее возбуждалось [`BadStatusLine`](https://python-all.ru/3.15/library/http.client.html#http.client.BadStatusLine)`('')`.149150Константы, определённые в этом модуле:151152#### `http.client.HTTP_PORT`153154Порт по умолчанию для протокола HTTP (всегда `80`).155156#### `http.client.HTTPS_PORT`157158Порт по умолчанию для протокола HTTPS (всегда `443`).159160#### `http.client.responses`161162Этот словарь сопоставляет коды состояния HTTP 1.1 с названиями W3C.163164Пример: `http.client.responses[http.client.NOT_FOUND]` – это `'Not Found'`.165166См. [коды состояния HTTP](https://python-all.ru/3.15/library/http.html#http-status-codes) для списка кодов состояния HTTP, доступных в этом модуле как константы.167168## Объекты HTTPConnection169170Экземпляры [`HTTPConnection`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPConnection) имеют следующие методы:171172#### `HTTPConnection.request(method, url, body=None, headers={}, *, encode_chunked=False)`173174Отправляет запрос на сервер, используя метод HTTP *method* и URI запроса *url*. Указанный *url* должен быть абсолютным путём для соответствия [**RFC 2616 §5.1.2**](https://python-all.ru/3.15/library/http.client.html) (если только не выполняется подключение к HTTP-прокси или не используются методы `OPTIONS` или `CONNECT`).175176Если указан *body*, указанные данные отправляются после завершения заголовков. Это может быть [`str`](https://python-all.ru/3.15/library/stdtypes.html#str), [байтоподобный объект](https://python-all.ru/3.15/glossary.html#term-bytes-like-object), открытый [файловый объект](https://python-all.ru/3.15/glossary.html#term-file-object) или итерируемый объект из [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes). Если *body* является строкой, она кодируется как ISO-8859-1, стандартная для HTTP. Если это байтоподобный объект, байты отправляются как есть. Если это файловый объект, отправляется содержимое файла; этот файловый объект должен поддерживать как минимум метод `read()`. Если файловый объект является экземпляром [`io.TextIOBase`](https://python-all.ru/3.15/library/io.html#io.TextIOBase), данные, возвращаемые методом `read()`, будут закодированы как ISO-8859-1; в противном случае данные, возвращаемые `read()`, отправляются как есть. Если *body* является итерируемым объектом, элементы итерируемого объекта отправляются как есть до его исчерпания.177178Аргумент *headers* должен быть отображением дополнительных HTTP-заголовков для отправки с запросом. [**Заголовок Host**](https://python-all.ru/3.15/library/http.client.html) должен быть предоставлен для соответствия [**RFC 2616 §5.1.2**](https://python-all.ru/3.15/library/http.client.html) (за исключением случаев подключения к HTTP-прокси-серверу или использования методов `OPTIONS` или `CONNECT`).179180Если *headers* не содержит ни Content-Length, ни Transfer-Encoding, но есть тело запроса, одно из этих полей заголовка будет добавлено автоматически. Если *body* равно `None`, заголовок Content-Length устанавливается в `0` для методов, которые ожидают тело (`PUT`, `POST` и `PATCH`). Если *body* является строкой или байтоподобным объектом, который не является также [файлом](https://python-all.ru/3.15/glossary.html#term-file-object), заголовок Content-Length устанавливается в его длину. Любой другой тип *body* (файлы и итерируемые объекты в целом) будет передаваться по частям, и заголовок Transfer-Encoding будет установлен автоматически вместо Content-Length.181182Аргумент *encode\_chunked* актуален только в том случае, если в *headers* указан Transfer-Encoding. Если *encode\_chunked* равно `False`, объект HTTPConnection предполагает, что всё кодирование выполняется вызывающим кодом. Если равно `True`, тело будет закодировано по частям (chunked).183184Например, для выполнения запроса `GET` к `https://docs.python.org/3/`:185186```python187>>> import http.client188>>> host = "docs.python.org"189>>> conn = http.client.HTTPSConnection(host)190>>> conn.request("GET", "/3/", headers={"Host": host})191>>> response = conn.getresponse()192>>> print(response.status, response.reason)193200 OK194```195196> **Примечание**197>198> Фрагментированное кодирование передачи (chunked transfer encoding) было добавлено в протокол HTTP версии 1.1. Если неизвестно, что HTTP-сервер поддерживает HTTP 1.1, вызывающий код должен либо указать Content-Length, либо передать [`str`](https://python-all.ru/3.15/library/stdtypes.html#str) или байтоподобный объект, который не является файлом, в качестве представления тела.199200> **Примечание**201>202> Обратите внимание, что необходимо полностью прочитать ответ или вызвать [`close()`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPConnection.close), если [`getresponse()`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPConnection.getresponse) вызвал исключение, отличное от [`ConnectionError`](https://python-all.ru/3.15/library/exceptions.html#ConnectionError), прежде чем можно будет отправить новый запрос на сервер.203204Изменено в версии 3.2: *body* теперь может быть итерируемым объектом.205206Изменено в версии 3.6: Если в *headers* не установлены ни Content-Length, ни Transfer-Encoding, файловые и итерируемые объекты *body* теперь кодируются по частям (chunked). Был добавлен аргумент *encode\_chunked*. Для файловых объектов не предпринимается попыток определить Content-Length.207208#### `HTTPConnection.getresponse()`209210Должен вызываться после отправки запроса для получения ответа от сервера. Возвращает экземпляр [`HTTPResponse`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPResponse).211212Изменено в версии 3.5: Если возникло исключение [`ConnectionError`](https://python-all.ru/3.15/library/exceptions.html#ConnectionError) или его подкласс, объект [`HTTPConnection`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPConnection) будет готов к переподключению при отправке нового запроса.213214Обратите внимание, что это не относится к [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), вызванным нижележащим сокетом. Вместо этого вызывающий код отвечает за вызов [`close()`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPConnection.close) на существующем соединении.215216#### `HTTPConnection.set_debuglevel(level)`217218Устанавливает уровень отладки. Уровень отладки по умолчанию – `0`, что означает отсутствие вывода отладочной информации. Любое значение больше `0` приведет к выводу всей текущей отладочной информации в stdout. Значение `debuglevel` передается всем новым создаваемым объектам [`HTTPResponse`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPResponse).219220Добавлено в версии 3.1.221222#### `HTTPConnection.set_tunnel(host, port=None, headers=None)`223224Устанавливает хост и порт для HTTP Connect Tunnelling. Это позволяет пропускать соединение через прокси-сервер.225226Аргументы *host* и *port* задают конечную точку туннелированного соединения (т. е. адрес, включаемый в запрос CONNECT, *а не* адрес прокси-сервера).227228Аргумент *headers* должен быть отображением дополнительных HTTP-заголовков для отправки с запросом CONNECT.229230Поскольку для туннелирования HTTP CONNECT используется HTTP/1.1, [в соответствии с RFC](https://python-all.ru/3.15/library/http.client.html) необходимо предоставить HTTP-заголовок `Host:`, соответствующий форме authority целевого запроса, указанного в качестве назначения для запроса CONNECT. Если HTTP-заголовок `Host:` не предоставлен через аргумент headers, он генерируется и передается автоматически.231232Например, чтобы пройти туннель через HTTPS-прокси-сервер, работающий локально на порту 8080, нужно передать адрес прокси конструктору [`HTTPSConnection`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPSConnection), а адрес хоста, который мы в конечном итоге хотим достичь, методу `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Изменено в версии 3.12: Запросы туннелирования HTTP CONNECT используют протокол HTTP/1.1, обновленный с протокола HTTP/1.0. HTTP-заголовки `Host:` являются обязательными для HTTP/1.1, поэтому, если они не предоставлены в аргументе headers, один будет автоматически сгенерирован и передан.244245#### `HTTPConnection.get_proxy_response_headers()`246247Возвращает словарь с заголовками ответа, полученного от прокси-сервера на запрос CONNECT.248249Если запрос CONNECT не был отправлен, метод возвращает `None`.250251Добавлено в версии 3.12.252253#### `HTTPConnection.connect()`254255Подключается к серверу, указанному при создании объекта. По умолчанию этот метод вызывается автоматически при выполнении запроса, если у клиента ещё нет соединения.256257Вызывает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `http.client.connect` с аргументами `self`, `host`, `port`.258259#### `HTTPConnection.close()`260261Закрывает соединение с сервером.262263#### `HTTPConnection.blocksize`264265Размер буфера в байтах для отправки тела сообщения в виде файла.266267Добавлено в версии 3.7.268269#### `HTTPConnection.max_response_headers`270271Максимальное количество разрешённых заголовков ответа для предотвращения атак типа «отказ в обслуживании». По умолчанию максимальное количество заголовков равно 100. Это же ограничение применяется к секции трейлеров фрагментированного (chunked) ответа.272273Добавлено в версии 3.15.274275В качестве альтернативы использованию описанного выше метода [`request()`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPConnection.request) вы также можете отправлять запрос пошагово, используя четыре функции, приведённые ниже.276277#### `HTTPConnection.putrequest(method, url, skip_host=False, skip_accept_encoding=False)`278279Этот вызов должен быть первым после установки соединения с сервером. Он отправляет на сервер строку, состоящую из строки *method*, строки *url* и версии HTTP (`HTTP/1.1`). Чтобы отключить автоматическую отправку заголовков `Host:` или `Accept-Encoding:` (например, для приёма дополнительных кодировок содержимого), укажите *skip\_host* или *skip\_accept\_encoding* со значением, отличным от False.280281#### `HTTPConnection.putheader(header, argument[, ...])`282283Отправляет заголовок в стиле [**RFC 822**](https://python-all.ru/3.15/library/http.client.html) на сервер. Он отправляет строку, состоящую из заголовка, двоеточия, пробела и первого аргумента. Если заданы дополнительные аргументы, отправляются строки продолжения, каждая из которых состоит из табуляции и аргумента.284285#### `HTTPConnection.endheaders(message_body=None, *, encode_chunked=False)`286287Отправляет пустую строку на сервер, сигнализируя об окончании заголовков. Необязательный аргумент *message\_body* можно использовать для передачи тела сообщения, связанного с запросом.288289Если *encode\_chunked* равно `True`, результат каждой итерации *message\_body* будет кодироваться по частям (chunk-encoded), как указано в [**RFC 7230**](https://python-all.ru/3.15/library/http.client.html), раздел 3.3.1. Способ кодирования данных зависит от типа *message\_body*. Если *message\_body* реализует [интерфейс буфера](https://python-all.ru/3.15/c-api/buffer.html#bufferobjects), кодирование даст один чанк. Если *message\_body* – это [`collections.abc.Iterable`](https://python-all.ru/3.15/library/collections.abc.html#collections.abc.Iterable), каждая итерация *message\_body* даст чанк. Если *message\_body* – это [файловый объект](https://python-all.ru/3.15/glossary.html#term-file-object), каждый вызов `.read()` даст чанк. Метод автоматически сигнализирует об окончании данных, закодированных чанками, сразу после *message\_body*.290291> **Примечание**292>293> В соответствии со спецификацией кодирования чанками, пустые чанки, полученные из тела-итератора, будут игнорироваться кодировщиком чанков. Это сделано для предотвращения преждевременного завершения чтения запроса целевым сервером из-за неверного кодирования.294295Изменено в версии 3.6: Добавлена поддержка кодирования чанками и параметр *encode\_chunked*.296297#### `HTTPConnection.send(data)`298299Отправляет данные на сервер. Это следует использовать напрямую только после вызова метода [`endheaders()`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPConnection.endheaders) и до вызова [`getresponse()`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPConnection.getresponse).300301Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `http.client.send` с аргументами `self`, `data`.302303## Объекты HTTPResponse304305Экземпляр [`HTTPResponse`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPResponse) оборачивает HTTP-ответ от сервера. Он предоставляет доступ к заголовкам запроса и телу сущности. Ответ является итерируемым объектом и может использоваться в операторе with.306307Изменено в версии 3.5: Теперь реализован интерфейс [`io.BufferedIOBase`](https://python-all.ru/3.15/library/io.html#io.BufferedIOBase) и поддерживаются все его операции чтения.308309#### `HTTPResponse.read([amt])`310311Читает и возвращает тело ответа, или до следующих *amt* байт.312313#### `HTTPResponse.readinto(b)`314315Читает до следующих len(b) байт тела ответа в буфер *b*. Возвращает количество прочитанных байт.316317Добавлено в версии 3.3.318319#### `HTTPResponse.getheader(name, default=None)`320321Возвращает значение заголовка *name* или *default*, если нет заголовка с именем *name*. Если существует несколько заголовков с именем *name*, возвращает все значения, объединённые через ', '. Если *default* – любой итерируемый объект, кроме одиночной строки, его элементы аналогично возвращаются объединёнными через запятую.322323#### `HTTPResponse.getheaders()`324325Возвращает список кортежей (заголовок, значение).326327#### `HTTPResponse.fileno()`328329Возвращает `fileno` базового сокета.330331#### `HTTPResponse.msg`332333Экземпляр [`http.client.HTTPMessage`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPMessage), содержащий заголовки ответа. `http.client.HTTPMessage` является подклассом [`email.message.Message`](https://python-all.ru/3.15/library/email.compat32-message.html#email.message.Message).334335#### `HTTPResponse.version`336337Версия протокола HTTP, используемая сервером. 10 для HTTP/1.0, 11 для HTTP/1.1.338339#### `HTTPResponse.url`340341URL полученного ресурса, обычно используется для определения, был ли выполнен редирект.342343#### `HTTPResponse.headers`344345Заголовки ответа в виде экземпляра [`email.message.EmailMessage`](https://python-all.ru/3.15/library/email.message.html#email.message.EmailMessage).346347#### `HTTPResponse.status`348349Код состояния, возвращаемый сервером.350351#### `HTTPResponse.reason`352353Фраза причины, возвращаемая сервером.354355#### `HTTPResponse.debuglevel`356357Отладочная привязка. Если [`debuglevel`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPResponse.debuglevel) больше нуля, сообщения будут выводиться в stdout по мере чтения и разбора ответа.358359#### `HTTPResponse.closed`360361Равно `True`, если поток закрыт.362363#### `HTTPResponse.geturl()`364365Устарело с версии 3.9: Устарело в пользу [`url`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPResponse.url).366367#### `HTTPResponse.info()`368369Устарело с версии 3.9: Устарело в пользу [`headers`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPResponse.headers).370371#### `HTTPResponse.getcode()`372373Устарело с версии 3.9: Устарело в пользу [`status`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPResponse.status).374375## Примеры376377Вот пример сеанса, в котором используется метод `GET`:378379```python380>>> import http.client381>>> conn = http.client.HTTPSConnection("www.python.org")382>>> conn.request("GET", "/")383>>> r1 = conn.getresponse()384>>> print(r1.status, r1.reason)385200 OK386>>> data1 = r1.read() # Возвращает всё содержимое.387>>> # Следующий пример демонстрирует чтение данных по частям.388>>> conn.request("GET", "/")389>>> r1 = conn.getresponse()390>>> while chunk := r1.read(200):391... print(repr(chunk))392b'<!doctype html>\n<!--[if"...393...394>>> # Пример некорректного запроса395>>> conn = http.client.HTTPSConnection("docs.python.org")396>>> conn.request("GET", "/parrot.spam")397>>> r2 = conn.getresponse()398>>> print(r2.status, r2.reason)399404 Not Found400>>> data2 = r2.read()401>>> conn.close()402```403404Вот пример сеанса, в котором используется метод `HEAD`. Обратите внимание, что метод `HEAD` никогда не возвращает данные.405406```python407>>> import http.client408>>> conn = http.client.HTTPSConnection("www.python.org")409>>> conn.request("HEAD", "/")410>>> res = conn.getresponse()411>>> print(res.status, res.reason)412200 OK413>>> data = res.read()414>>> print(len(data))4150416>>> data == b''417True418```419420Вот пример сеанса, в котором используется метод `POST`:421422```python423>>> import http.client, urllib.parse424>>> params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})425>>> headers = {"Content-type": "application/x-www-form-urlencoded",426... "Accept": "text/plain"}427>>> conn = http.client.HTTPConnection("bugs.python.org")428>>> conn.request("POST", "", params, headers)429>>> response = conn.getresponse()430>>> print(response.status, response.reason)431302 Found432>>> data = response.read()433>>> data434b'Redirecting to <a href="https://bugs.python.org/issue12524">https://bugs.python.org/issue12524</a>'435>>> conn.close()436```437438HTTP-запросы `PUT` на стороне клиента очень похожи на запросы `POST`. Разница есть только на стороне сервера, где HTTP-серверы разрешают создание ресурсов через запросы `PUT`. Следует отметить, что нестандартные методы HTTP также обрабатываются в [`urllib.request.Request`](https://python-all.ru/3.15/library/urllib.request.html#urllib.request.Request) путём установки соответствующего атрибута method. Вот пример сеанса, в котором используется метод `PUT`:439440```python441>>> # Это создаёт HTTP-запрос442>>> # с содержимым BODY в качестве вложенного представления443>>> # для ресурса http://localhost:8080/file444...445>>> import http.client446>>> BODY = "***filecontents***"447>>> conn = http.client.HTTPConnection("localhost", 8080)448>>> conn.request("PUT", "/file", BODY)449>>> response = conn.getresponse()450>>> print(response.status, response.reason)451200, OK452```453454## Объекты HTTPMessage455456#### `class http.client.HTTPMessage(email.message.Message)`457458Экземпляр [`http.client.HTTPMessage`](https://python-all.ru/3.15/library/http.client.html#http.client.HTTPMessage) содержит заголовки из HTTP ответа. Он реализован с помощью класса [`email.message.Message`](https://python-all.ru/3.15/library/email.compat32-message.html#email.message.Message).459