http.client.md
1> **Источник:** https://python-all.ru/3.2/library/http.client.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.10. [`http.client`](https://python-all.ru/3.2/library/http.client.html#module-http.client) – клиент протокола HTTP89**Исходный код:** [Lib/http/client.py](https://python-all.ru/src/3.2/Lib/http/client.py)1011---1213Этот модуль определяет классы, реализующие клиентскую сторону протоколов HTTP и HTTPS. Обычно он не используется напрямую – модуль [`urllib.request`](https://python-all.ru/3.2/library/urllib.request.html#module-urllib.request) применяет его для обработки URL, использующих HTTP и HTTPS.1415> **Примечание**16>17> Поддержка HTTPS доступна только в том случае, если Python был собран с поддержкой SSL (через модуль [`ssl`](https://python-all.ru/3.2/library/ssl.html#module-ssl)).1819Модуль предоставляет следующие классы:2021#### `class http.client.HTTPConnection(host, port=None[, strict][, timeout], source_address=None)`2223Экземпляр [`HTTPConnection`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPConnection) представляет одну транзакцию с HTTP-сервером. При создании ему передаются имя хоста и необязательный номер порта. Если номер порта не указан, порт извлекается из строки хоста, если она имеет вид `host:port`; в противном случае используется порт HTTP по умолчанию (80). Если задан необязательный параметр *timeout*, блокирующие операции (например, попытки подключения) будут завершаться по тайм-ауту через указанное количество секунд (если параметр не задан, используется глобальная настройка тайм-аута по умолчанию). Необязательный параметр *source\_address* может быть кортежем (host, port), который будет использоваться в качестве исходного адреса для HTTP-соединения.2425Например, следующие вызовы создают экземпляры, подключающиеся к одному и тому же серверу по одному и тому же хосту и порту:2627```python28>>> h1 = http.client.HTTPConnection('www.cwi.nl')29>>> h2 = http.client.HTTPConnection('www.cwi.nl:80')30>>> h3 = http.client.HTTPConnection('www.cwi.nl', 80)31>>> h3 = http.client.HTTPConnection('www.cwi.nl', 80, timeout=10)32```3334Изменено в версии 3.2: Был добавлен параметр *source\_address*.3536Устарело с версии 3.2: Параметр *strict* устарел. Ответы в стиле HTTP 0.9 («Simple Responses») больше не поддерживаются.3738#### `class http.client.HTTPSConnection(host, port=None, key_file=None, cert_file=None[, strict][, timeout], source_address=None, *, context=None, check_hostname=None)`3940A subclass of [`HTTPConnection`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPConnection) that uses SSL for communication with secure servers. Default port is `443`. If *context* is specified, it must be a [`ssl.SSLContext`](https://python-all.ru/3.2/library/ssl.html#ssl.SSLContext) instance describing the various SSL options. If *context* is specified and has a [`verify_mode`](https://python-all.ru/3.2/library/ssl.html#ssl.SSLContext.verify_mode) of either [`CERT_OPTIONAL`](https://python-all.ru/3.2/library/ssl.html#ssl.CERT_OPTIONAL) or [`CERT_REQUIRED`](https://python-all.ru/3.2/library/ssl.html#ssl.CERT_REQUIRED), then by default *host* is matched against the host name(s) allowed by the server’s certificate. If you want to change that behaviour, you can explicitly set *check\_hostname* to False.4142*key\_file* и *cert\_file* устарели, используйте вместо них [`ssl.SSLContext.load_cert_chain()`](https://python-all.ru/3.2/library/ssl.html#ssl.SSLContext.load_cert_chain).4344При доступе к произвольным хостам в Интернете рекомендуется требовать проверку сертификата и передать в *context* набор доверенных сертификатов УЦ:4546```python47context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)48context.verify_mode = ssl.CERT_REQUIRED49context.load_verify_locations('/etc/pki/tls/certs/ca-bundle.crt')50h = client.HTTPSConnection('svn.python.org', 443, context=context)51```5253Изменено в версии 3.2: Были добавлены параметры *source\_address*, *context* и *check\_hostname*.5455Изменено в версии 3.2: Этот класс теперь поддерживает виртуальные хосты HTTPS, если это возможно (то есть, если [`ssl.HAS_SNI`](https://python-all.ru/3.2/library/ssl.html#ssl.HAS_SNI) истинно).5657Устарело с версии 3.2: Параметр *strict* устарел. Ответы в стиле HTTP 0.9 («Simple Responses») больше не поддерживаются.5859#### `class http.client.HTTPResponse(sock, debuglevel=0[, strict], method=None, url=None)`6061Класс, экземпляры которого возвращаются при успешном соединении. Не создаётся напрямую пользователем.6263Устарело с версии 3.2: Параметр *strict* устарел. Ответы в стиле HTTP 0.9 («Simple Responses») больше не поддерживаются.6465При необходимости генерируются следующие исключения:6667#### `exception http.client.HTTPException`6869Базовый класс остальных исключений этого модуля. Является подклассом [`Exception`](https://python-all.ru/3.2/library/exceptions.html#Exception).7071#### `exception http.client.NotConnected`7273Подкласс [`HTTPException`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPException).7475#### `exception http.client.InvalidURL`7677Подкласс [`HTTPException`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPException); возбуждается, если указан порт, но он не является числом или пуст.7879#### `exception http.client.UnknownProtocol`8081Подкласс [`HTTPException`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPException).8283#### `exception http.client.UnknownTransferEncoding`8485Подкласс [`HTTPException`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPException).8687#### `exception http.client.UnimplementedFileMode`8889Подкласс [`HTTPException`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPException).9091#### `exception http.client.IncompleteRead`9293Подкласс [`HTTPException`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPException).9495#### `exception http.client.ImproperConnectionState`9697Подкласс [`HTTPException`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPException).9899#### `exception http.client.CannotSendRequest`100101Подкласс [`ImproperConnectionState`](https://python-all.ru/3.2/library/http.client.html#http.client.ImproperConnectionState).102103#### `exception http.client.CannotSendHeader`104105Подкласс [`ImproperConnectionState`](https://python-all.ru/3.2/library/http.client.html#http.client.ImproperConnectionState).106107#### `exception http.client.ResponseNotReady`108109Подкласс [`ImproperConnectionState`](https://python-all.ru/3.2/library/http.client.html#http.client.ImproperConnectionState).110111#### `exception http.client.BadStatusLine`112113Подкласс [`HTTPException`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPException). Возникает, если сервер отвечает кодом состояния HTTP, который не удаётся распознать.114115Константы, определённые в этом модуле:116117#### `http.client.HTTP_PORT`118119Порт по умолчанию для протокола HTTP (всегда `80`).120121#### `http.client.HTTPS_PORT`122123Порт по умолчанию для протокола HTTPS (всегда `443`).124125а также следующие константы для целочисленных кодов состояния:126127| Константа | Значение | Определение |128| --- | --- | --- |129| `CONTINUE` | `100` | HTTP/1.1, [RFC 2616, раздел 10.1.1](https://python-all.ru/3.2/library/http.client.html) |130| `SWITCHING_PROTOCOLS` | `101` | HTTP/1.1, [RFC 2616, раздел 10.1.2](https://python-all.ru/3.2/library/http.client.html) |131| `PROCESSING` | `102` | WEBDAV, [RFC 2518, раздел 10.1](https://python-all.ru/3.2/library/http.client.html) |132| `OK` | `200` | HTTP/1.1, [RFC 2616, раздел 10.2.1](https://python-all.ru/3.2/library/http.client.html) |133| `CREATED` | `201` | HTTP/1.1, [RFC 2616, раздел 10.2.2](https://python-all.ru/3.2/library/http.client.html) |134| `ACCEPTED` | `202` | HTTP/1.1, [RFC 2616, раздел 10.2.3](https://python-all.ru/3.2/library/http.client.html) |135| `NON_AUTHORITATIVE_INFORMATION` | `203` | HTTP/1.1, [RFC 2616, раздел 10.2.4](https://python-all.ru/3.2/library/http.client.html) |136| `NO_CONTENT` | `204` | HTTP/1.1, [RFC 2616, раздел 10.2.5](https://python-all.ru/3.2/library/http.client.html) |137| `RESET_CONTENT` | `205` | HTTP/1.1, [RFC 2616, раздел 10.2.6](https://python-all.ru/3.2/library/http.client.html) |138| `PARTIAL_CONTENT` | `206` | HTTP/1.1, [RFC 2616, раздел 10.2.7](https://python-all.ru/3.2/library/http.client.html) |139| `MULTI_STATUS` | `207` | WEBDAV [RFC 2518, раздел 10.2](https://python-all.ru/3.2/library/http.client.html) |140| `IM_USED` | `226` | Дельта-кодирование в HTTP, [**RFC 3229**](https://python-all.ru/3.2/library/http.client.html), раздел 10.4.1 |141| `MULTIPLE_CHOICES` | `300` | HTTP/1.1, [RFC 2616, раздел 10.3.1](https://python-all.ru/3.2/library/http.client.html) |142| `MOVED_PERMANENTLY` | `301` | HTTP/1.1, [RFC 2616, раздел 10.3.2](https://python-all.ru/3.2/library/http.client.html) |143| `FOUND` | `302` | HTTP/1.1, [RFC 2616, раздел 10.3.3](https://python-all.ru/3.2/library/http.client.html) |144| `SEE_OTHER` | `303` | HTTP/1.1, [RFC 2616, раздел 10.3.4](https://python-all.ru/3.2/library/http.client.html) |145| `NOT_MODIFIED` | `304` | HTTP/1.1, [RFC 2616, раздел 10.3.5](https://python-all.ru/3.2/library/http.client.html) |146| `USE_PROXY` | `305` | HTTP/1.1, [RFC 2616, раздел 10.3.6](https://python-all.ru/3.2/library/http.client.html) |147| `TEMPORARY_REDIRECT` | `307` | HTTP/1.1, [RFC 2616, раздел 10.3.8](https://python-all.ru/3.2/library/http.client.html) |148| `BAD_REQUEST` | `400` | HTTP/1.1, [RFC 2616, раздел 10.4.1](https://python-all.ru/3.2/library/http.client.html) |149| `UNAUTHORIZED` | `401` | HTTP/1.1, [RFC 2616, раздел 10.4.2](https://python-all.ru/3.2/library/http.client.html) |150| `PAYMENT_REQUIRED` | `402` | HTTP/1.1, [RFC 2616, раздел 10.4.3](https://python-all.ru/3.2/library/http.client.html) |151| `FORBIDDEN` | `403` | HTTP/1.1, [RFC 2616, раздел 10.4.4](https://python-all.ru/3.2/library/http.client.html) |152| `NOT_FOUND` | `404` | HTTP/1.1, [RFC 2616, раздел 10.4.5](https://python-all.ru/3.2/library/http.client.html) |153| `METHOD_NOT_ALLOWED` | `405` | HTTP/1.1, [RFC 2616, раздел 10.4.6](https://python-all.ru/3.2/library/http.client.html) |154| `NOT_ACCEPTABLE` | `406` | HTTP/1.1, [RFC 2616, раздел 10.4.7](https://python-all.ru/3.2/library/http.client.html) |155| `PROXY_AUTHENTICATION_REQUIRED` | `407` | HTTP/1.1, [RFC 2616, раздел 10.4.8](https://python-all.ru/3.2/library/http.client.html) |156| `REQUEST_TIMEOUT` | `408` | HTTP/1.1, [RFC 2616, раздел 10.4.9](https://python-all.ru/3.2/library/http.client.html) |157| `CONFLICT` | `409` | HTTP/1.1, [RFC 2616, раздел 10.4.10](https://python-all.ru/3.2/library/http.client.html) |158| `GONE` | `410` | HTTP/1.1, [RFC 2616, раздел 10.4.11](https://python-all.ru/3.2/library/http.client.html) |159| `LENGTH_REQUIRED` | `411` | HTTP/1.1, [RFC 2616, раздел 10.4.12](https://python-all.ru/3.2/library/http.client.html) |160| `PRECONDITION_FAILED` | `412` | HTTP/1.1, [RFC 2616, раздел 10.4.13](https://python-all.ru/3.2/library/http.client.html) |161| `REQUEST_ENTITY_TOO_LARGE` | `413` | HTTP/1.1, [RFC 2616, раздел 10.4.14](https://python-all.ru/3.2/library/http.client.html) |162| `REQUEST_URI_TOO_LONG` | `414` | HTTP/1.1, [RFC 2616, раздел 10.4.15](https://python-all.ru/3.2/library/http.client.html) |163| `UNSUPPORTED_MEDIA_TYPE` | `415` | HTTP/1.1, [RFC 2616, раздел 10.4.16](https://python-all.ru/3.2/library/http.client.html) |164| `REQUESTED_RANGE_NOT_SATISFIABLE` | `416` | HTTP/1.1, [RFC 2616, раздел 10.4.17](https://python-all.ru/3.2/library/http.client.html) |165| `EXPECTATION_FAILED` | `417` | HTTP/1.1, [RFC 2616, раздел 10.4.18](https://python-all.ru/3.2/library/http.client.html) |166| `UNPROCESSABLE_ENTITY` | `422` | WEBDAV, [RFC 2518, раздел 10.3](https://python-all.ru/3.2/library/http.client.html) |167| `LOCKED` | `423` | WEBDAV [RFC 2518, раздел 10.4](https://python-all.ru/3.2/library/http.client.html) |168| `FAILED_DEPENDENCY` | `424` | WEBDAV, [RFC 2518, раздел 10.5](https://python-all.ru/3.2/library/http.client.html) |169| `UPGRADE_REQUIRED` | `426` | Обновление HTTP до TLS, [**RFC 2817**](https://python-all.ru/3.2/library/http.client.html), раздел 6 |170| `INTERNAL_SERVER_ERROR` | `500` | HTTP/1.1, [RFC 2616, раздел 10.5.1](https://python-all.ru/3.2/library/http.client.html) |171| `NOT_IMPLEMENTED` | `501` | HTTP/1.1, [RFC 2616, раздел 10.5.2](https://python-all.ru/3.2/library/http.client.html) |172| `BAD_GATEWAY` | `502` | HTTP/1.1 [RFC 2616, раздел 10.5.3](https://python-all.ru/3.2/library/http.client.html) |173| `SERVICE_UNAVAILABLE` | `503` | HTTP/1.1, [RFC 2616, раздел 10.5.4](https://python-all.ru/3.2/library/http.client.html) |174| `GATEWAY_TIMEOUT` | `504` | HTTP/1.1 [RFC 2616, раздел 10.5.5](https://python-all.ru/3.2/library/http.client.html) |175| `HTTP_VERSION_NOT_SUPPORTED` | `505` | HTTP/1.1, [RFC 2616, раздел 10.5.6](https://python-all.ru/3.2/library/http.client.html) |176| `INSUFFICIENT_STORAGE` | `507` | WEBDAV, [RFC 2518, раздел 10.6](https://python-all.ru/3.2/library/http.client.html) |177| `NOT_EXTENDED` | `510` | Расширение HTTP Framework, [**RFC 2774**](https://python-all.ru/3.2/library/http.client.html), раздел 7 |178179#### `http.client.responses`180181Этот словарь сопоставляет коды состояния HTTP 1.1 с названиями W3C.182183Пример: `http.client.responses[http.client.NOT_FOUND]` – это `'Not Found'`.184185## 20.10.1. HTTPConnection Objects186187Экземпляры [`HTTPConnection`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPConnection) имеют следующие методы:188189#### `HTTPConnection.request(method, url, body=None, headers={})`190191Это отправляет запрос на сервер, используя метод HTTP-запроса *method* и селектор *url*. Если аргумент *body* присутствует, он должен быть строкой или объектом bytes с данными для отправки после завершения заголовков. Строки кодируются как ISO-8859-1, кодировка по умолчанию для HTTP. Для использования других кодировок передавайте объект bytes. Заголовок Content-Length устанавливается равным длине строки.192193Аргумент *body* также может быть открытым [*файловым объектом*](https://python-all.ru/3.2/glossary.html#term-file-object), и в этом случае отправляется содержимое файла; этот файловый объект должен поддерживать методы `fileno()` и `read()`. Заголовок Content-Length автоматически устанавливается равным длине файла, полученной через stat. Аргумент *body* также может быть итерируемым объектом, и в этом случае заголовок Content-Length должен быть указан явно.194195Аргумент *headers* должен быть отображением дополнительных HTTP-заголовков, отправляемых вместе с запросом.196197Новое в версии 3.2: аргумент *body* теперь может быть итерируемым объектом.198199#### `HTTPConnection.getresponse()`200201Должен вызываться после отправки запроса для получения ответа от сервера. Возвращает экземпляр [`HTTPResponse`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPResponse).202203> **Примечание**204>205> Обратите внимание: необходимо прочитать весь ответ, прежде чем отправлять новый запрос на сервер.206207#### `HTTPConnection.set_debuglevel(level)`208209Устанавливает уровень отладки. Уровень отладки по умолчанию равен `0`, то есть отладочный вывод не производится. Любое значение больше `0` приведёт к выводу всех текущих определённых отладочных сообщений в stdout. `debuglevel` передаётся всем новым создаваемым объектам [`HTTPResponse`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPResponse).210211Новое в версии 3.1.212213#### `HTTPConnection.set_tunnel(host, port=None, headers=None)`214215Устанавливает хост и порт для HTTP-туннелирования через CONNECT. Обычно используется, когда требуется подключение HTTPS через прокси-сервер.216217Аргумент headers должен быть отображением дополнительных HTTP-заголовков, отправляемых с запросом CONNECT.218219Новое в версии 3.2.220221#### `HTTPConnection.connect()`222223Подключается к серверу, указанному при создании объекта.224225#### `HTTPConnection.close()`226227Закрывает соединение с сервером.228229В качестве альтернативы описанному выше методу `request()` можно отправлять запрос пошагово, используя четыре функции ниже.230231#### `HTTPConnection.putrequest(request, selector, skip_host=False, skip_accept_encoding=False)`232233Это должен быть первый вызов после установки соединения с сервером. Он отправляет серверу строку, состоящую из строки *request*, строки *selector* и версии HTTP (`HTTP/1.1`). Чтобы отключить автоматическую отправку заголовков `Host:` или `Accept-Encoding:` (например, для поддержки дополнительных кодировок содержимого), укажите *skip\_host* или *skip\_accept\_encoding* со значениями, отличными от False.234235#### `HTTPConnection.putheader(header, argument[, ...])`236237Отправляет заголовок в стиле [**RFC 822**](https://python-all.ru/3.2/library/http.client.html) на сервер. Он отправляет строку, состоящую из заголовка, двоеточия, пробела и первого аргумента. Если заданы дополнительные аргументы, отправляются строки продолжения, каждая из которых состоит из табуляции и аргумента.238239#### `HTTPConnection.endheaders(message_body=None)`240241Отправляет пустую строку серверу, сигнализируя об окончании заголовков. Необязательный аргумент *message\_body* можно использовать для передачи тела сообщения, связанного с запросом. Тело сообщения будет отправлено в том же пакете, что и заголовки, если оно является строкой; в противном случае оно отправляется в отдельном пакете.242243#### `HTTPConnection.send(data)`244245Send data to the server. This should be used directly only after the [`endheaders()`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPConnection.endheaders) method has been called and before [`getresponse()`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPConnection.getresponse) is called.246247## 20.10.2. Объекты HTTPResponse248249Экземпляр [`HTTPResponse`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPResponse) инкапсулирует HTTP-ответ от сервера. Он предоставляет доступ к заголовкам запроса и телу сущности. Ответ является итерируемым объектом и может использоваться в операторе with.250251#### `HTTPResponse.read([amt])`252253Читает и возвращает тело ответа, или до следующих *amt* байт.254255#### `HTTPResponse.getheader(name, default=None)`256257Возвращает значение заголовка *name* или *default*, если нет заголовка, соответствующего *name*. Если существует более одного заголовка с именем *name*, возвращает все значения, объединённые через ', '. Если 'default' является любым итерируемым объектом, отличным от одной строки, его элементы аналогично возвращаются объединёнными запятыми.258259#### `HTTPResponse.getheaders()`260261Возвращает список кортежей (заголовок, значение).262263#### `HTTPResponse.fileno()`264265Возвращает `fileno` нижележащего сокета.266267#### `HTTPResponse.msg`268269Экземпляр `http.client.HTTPMessage`, содержащий заголовки ответа. `http.client.HTTPMessage` является подклассом [`email.message.Message`](https://python-all.ru/3.2/library/email.message.html#email.message.Message).270271#### `HTTPResponse.version`272273Версия протокола HTTP, используемая сервером. 10 для HTTP/1.0, 11 для HTTP/1.1.274275#### `HTTPResponse.status`276277Код состояния, возвращаемый сервером.278279#### `HTTPResponse.reason`280281Фраза причины, возвращаемая сервером.282283#### `HTTPResponse.debuglevel`284285Отладочный хук. Если [`debuglevel`](https://python-all.ru/3.2/library/http.client.html#http.client.HTTPResponse.debuglevel) больше нуля, сообщения будут выводиться в stdout по мере чтения и разбора ответа.286287#### `HTTPResponse.closed`288289Имеет значение True, если поток закрыт.290291## 20.10.3. Примеры292293Ниже приведён пример сеанса, использующего метод `GET`:294295```python296>>> import http.client297>>> conn = http.client.HTTPConnection("www.python.org")298>>> conn.request("GET", "/index.html")299>>> r1 = conn.getresponse()300>>> print(r1.status, r1.reason)301200 OK302>>> data1 = r1.read() # Возвращает всё содержимое.303>>> # Следующий пример демонстрирует чтение данных по частям.304>>> conn.request("GET", "/index.html")305>>> r1 = conn.getresponse()306>>> while not r1.closed:307... print(r1.read(200)) # 200 байт308b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...309...310>>> # Пример некорректного запроса311>>> conn.request("GET", "/parrot.spam")312>>> r2 = conn.getresponse()313>>> print(r2.status, r2.reason)314404 Not Found315>>> data2 = r2.read()316>>> conn.close()317```318319Ниже приведён пример сеанса, использующего метод `HEAD`. Обратите внимание, что метод `HEAD` никогда не возвращает данные.320321```python322>>> import http.client323>>> conn = http.client.HTTPConnection("www.python.org")324>>> conn.request("HEAD","/index.html")325>>> res = conn.getresponse()326>>> print(res.status, res.reason)327200 OK328>>> data = res.read()329>>> print(len(data))3300331>>> data == b''332True333```334335Ниже приведён пример сеанса, показывающий, как выполнять запросы `POST`:336337```python338>>> import http.client, urllib.parse339>>> params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})340>>> headers = {"Content-type": "application/x-www-form-urlencoded",341... "Accept": "text/plain"}342>>> conn = http.client.HTTPConnection("bugs.python.org")343>>> conn.request("POST", "", params, headers)344>>> response = conn.getresponse()345>>> print(response.status, response.reason)346302 Found347>>> data = response.read()348>>> data349b'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'350>>> conn.close()351```352353Клиентские запросы `HTTP PUT` очень похожи на запросы `POST`. Различие заключается только на стороне сервера, где HTTP-сервер позволяет создавать ресурсы через запрос `PUT`. Вот пример сеанса, показывающий, как выполнить запрос `PUT` с помощью http.client:354355```python356>>> # Это создаёт HTTP-сообщение.357>>> # с содержимым BODY в качестве вложенного представления358>>> # для ресурса http://localhost:8080/foobar359...360>>> import http.client361>>> BODY = "***filecontents***"362>>> conn = http.client.HTTPConnection("localhost", 8080)363>>> conn.request("PUT", "/file", BODY)364>>> response = conn.getresponse()365>>> print(resp.status, response.reason)366200, OK367```368369## 20.10.4. Объекты HTTPMessage370371Экземпляр `http.client.HTTPMessage` содержит заголовки HTTP-ответа. Он реализован с помощью класса [`email.message.Message`](https://python-all.ru/3.2/library/email.message.html#email.message.Message).372