> **Источник:** https://python-all.ru/3.0/library/http.client.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `http.client` – клиент протокола HTTP

Этот модуль определяет классы, реализующие клиентскую сторону протоколов HTTP и HTTPS. Обычно он не используется напрямую – модуль [`urllib.request`](https://python-all.ru/3.0/library/urllib.request.html#module-urllib.request) применяет его для обработки URL, использующих HTTP и HTTPS.

> **Примечание**
>
> Поддержка HTTPS доступна только в том случае, если модуль [`socket`](https://python-all.ru/3.0/library/socket.html#module-socket) был скомпилирован с поддержкой SSL.

Модуль предоставляет следующие классы:

#### `[http.client.HTTPConnection]class http.client.HTTPConnection(host[, port[, strict[, timeout]]])`

Экземпляр [`HTTPConnection`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPConnection) представляет одну транзакцию с HTTP-сервером. Его следует создавать, передавая хост и необязательный номер порта. Если номер порта не передан, порт извлекается из строки хоста, если она имеет вид `host:port`; в противном случае используется порт HTTP по умолчанию (80). Если True, необязательный параметр *strict* (по умолчанию ложное значение) вызывает `BadStatusLine`, если строка состояния не может быть разобрана как допустимая строка состояния HTTP/1.0 или 1.1. Если задан необязательный параметр *timeout*, блокирующие операции (например, попытки соединения) будут прерваны по истечении этого количества секунд (если он не задан, используется глобальная настройка таймаута по умолчанию).

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

```python
>>> h1 = http.client.HTTPConnection('www.cwi.nl')
>>> h2 = http.client.HTTPConnection('www.cwi.nl:80')
>>> h3 = http.client.HTTPConnection('www.cwi.nl', 80)
>>> h3 = http.client.HTTPConnection('www.cwi.nl', 80, timeout=10)
```

#### `[http.client.HTTPSConnection]class http.client.HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout]]]]])`

Подкласс [`HTTPConnection`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPConnection), использующий SSL для связи с защищёнными серверами. Порт по умолчанию: `443`. *key\_file* – это имя PEM-файла, содержащего ваш закрытый ключ. *cert\_file* – это PEM-файл цепочки сертификатов.

> **Предупреждение**
>
> Проверка сертификатов не выполняется!

#### `[http.client.HTTPResponse]class http.client.HTTPResponse(sock[, debuglevel=0][, strict=0])`

Класс, экземпляры которого возвращаются при успешном подключении. Не создаётся напрямую пользователем.

При необходимости генерируются следующие исключения:

#### `[http.client.HTTPException]exception http.client.HTTPException`

Базовый класс остальных исключений этого модуля. Является подклассом

[`Exception`](https://python-all.ru/3.0/library/exceptions.html#exceptions.Exception)

.

#### `[http.client.NotConnected]exception http.client.NotConnected`

Подкласс

[`HTTPException`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPException)

.

#### `[http.client.InvalidURL]exception http.client.InvalidURL`

Подкласс

[`HTTPException`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPException)

; возбуждается, если указан порт, но он не является числом или пуст.

#### `[http.client.UnknownProtocol]exception http.client.UnknownProtocol`

Подкласс

[`HTTPException`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPException)

.

#### `[http.client.UnknownTransferEncoding]exception http.client.UnknownTransferEncoding`

Подкласс

[`HTTPException`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPException)

.

#### `[http.client.UnimplementedFileMode]exception http.client.UnimplementedFileMode`

Подкласс

[`HTTPException`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPException)

.

#### `[http.client.IncompleteRead]exception http.client.IncompleteRead`

Подкласс

[`HTTPException`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPException)

.

#### `[http.client.ImproperConnectionState]exception http.client.ImproperConnectionState`

Подкласс

[`HTTPException`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPException)

.

#### `[http.client.CannotSendRequest]exception http.client.CannotSendRequest`

Подкласс

[`ImproperConnectionState`](https://python-all.ru/3.0/library/http.client.html#http.client.ImproperConnectionState)

.

#### `[http.client.CannotSendHeader]exception http.client.CannotSendHeader`

Подкласс

[`ImproperConnectionState`](https://python-all.ru/3.0/library/http.client.html#http.client.ImproperConnectionState)

.

#### `[http.client.ResponseNotReady]exception http.client.ResponseNotReady`

Подкласс

[`ImproperConnectionState`](https://python-all.ru/3.0/library/http.client.html#http.client.ImproperConnectionState)

.

#### `[http.client.BadStatusLine]exception http.client.BadStatusLine`

Подкласс

[`HTTPException`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPException)

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

Константы, определённые в этом модуле:

#### `[http.client.HTTP_PORT]http.client.HTTP_PORT`

Порт по умолчанию для протокола HTTP (всегда

`80`

).

#### `[http.client.HTTPS_PORT]http.client.HTTPS_PORT`

Порт по умолчанию для протокола HTTPS (всегда

`443`

).

а также следующие константы для целочисленных кодов состояния:

| Константа | Значение | Определение |
| --- | --- | --- |
| `CONTINUE` | `100` | HTTP/1.1, [RFC 2616, раздел 10.1.1](https://python-all.ru/3.0/library/http.client.html) |
| `SWITCHING_PROTOCOLS` | `101` | HTTP/1.1, [RFC 2616, раздел 10.1.2](https://python-all.ru/3.0/library/http.client.html) |
| `PROCESSING` | `102` | WEBDAV, [RFC 2518, раздел 10.1](https://python-all.ru/3.0/library/http.client.html) |
| `OK` | `200` | HTTP/1.1, [RFC 2616, раздел 10.2.1](https://python-all.ru/3.0/library/http.client.html) |
| `CREATED` | `201` | HTTP/1.1, [RFC 2616, раздел 10.2.2](https://python-all.ru/3.0/library/http.client.html) |
| `ACCEPTED` | `202` | HTTP/1.1, [RFC 2616, раздел 10.2.3](https://python-all.ru/3.0/library/http.client.html) |
| `NON_AUTHORITATIVE_INFORMATION` | `203` | HTTP/1.1, [RFC 2616, раздел 10.2.4](https://python-all.ru/3.0/library/http.client.html) |
| `NO_CONTENT` | `204` | HTTP/1.1, [RFC 2616, раздел 10.2.5](https://python-all.ru/3.0/library/http.client.html) |
| `RESET_CONTENT` | `205` | HTTP/1.1, [RFC 2616, раздел 10.2.6](https://python-all.ru/3.0/library/http.client.html) |
| `PARTIAL_CONTENT` | `206` | HTTP/1.1, [RFC 2616, раздел 10.2.7](https://python-all.ru/3.0/library/http.client.html) |
| `MULTI_STATUS` | `207` | WEBDAV [RFC 2518, раздел 10.2](https://python-all.ru/3.0/library/http.client.html) |
| `IM_USED` | `226` | Дельта-кодирование в HTTP, [**RFC 3229**](https://python-all.ru/3.0/library/http.client.html), раздел 10.4.1 |
| `MULTIPLE_CHOICES` | `300` | HTTP/1.1, [RFC 2616, раздел 10.3.1](https://python-all.ru/3.0/library/http.client.html) |
| `MOVED_PERMANENTLY` | `301` | HTTP/1.1, [RFC 2616, раздел 10.3.2](https://python-all.ru/3.0/library/http.client.html) |
| `FOUND` | `302` | HTTP/1.1, [RFC 2616, раздел 10.3.3](https://python-all.ru/3.0/library/http.client.html) |
| `SEE_OTHER` | `303` | HTTP/1.1, [RFC 2616, раздел 10.3.4](https://python-all.ru/3.0/library/http.client.html) |
| `NOT_MODIFIED` | `304` | HTTP/1.1, [RFC 2616, раздел 10.3.5](https://python-all.ru/3.0/library/http.client.html) |
| `USE_PROXY` | `305` | HTTP/1.1, [RFC 2616, раздел 10.3.6](https://python-all.ru/3.0/library/http.client.html) |
| `TEMPORARY_REDIRECT` | `307` | HTTP/1.1, [RFC 2616, раздел 10.3.8](https://python-all.ru/3.0/library/http.client.html) |
| `BAD_REQUEST` | `400` | HTTP/1.1, [RFC 2616, раздел 10.4.1](https://python-all.ru/3.0/library/http.client.html) |
| `UNAUTHORIZED` | `401` | HTTP/1.1, [RFC 2616, раздел 10.4.2](https://python-all.ru/3.0/library/http.client.html) |
| `PAYMENT_REQUIRED` | `402` | HTTP/1.1, [RFC 2616, раздел 10.4.3](https://python-all.ru/3.0/library/http.client.html) |
| `FORBIDDEN` | `403` | HTTP/1.1, [RFC 2616, раздел 10.4.4](https://python-all.ru/3.0/library/http.client.html) |
| `NOT_FOUND` | `404` | HTTP/1.1, [RFC 2616, раздел 10.4.5](https://python-all.ru/3.0/library/http.client.html) |
| `METHOD_NOT_ALLOWED` | `405` | HTTP/1.1, [RFC 2616, раздел 10.4.6](https://python-all.ru/3.0/library/http.client.html) |
| `NOT_ACCEPTABLE` | `406` | HTTP/1.1, [RFC 2616, раздел 10.4.7](https://python-all.ru/3.0/library/http.client.html) |
| `PROXY_AUTHENTICATION_REQUIRED` | `407` | HTTP/1.1, [RFC 2616, раздел 10.4.8](https://python-all.ru/3.0/library/http.client.html) |
| `REQUEST_TIMEOUT` | `408` | HTTP/1.1, [RFC 2616, раздел 10.4.9](https://python-all.ru/3.0/library/http.client.html) |
| `CONFLICT` | `409` | HTTP/1.1, [RFC 2616, раздел 10.4.10](https://python-all.ru/3.0/library/http.client.html) |
| `GONE` | `410` | HTTP/1.1, [RFC 2616, раздел 10.4.11](https://python-all.ru/3.0/library/http.client.html) |
| `LENGTH_REQUIRED` | `411` | HTTP/1.1, [RFC 2616, раздел 10.4.12](https://python-all.ru/3.0/library/http.client.html) |
| `PRECONDITION_FAILED` | `412` | HTTP/1.1, [RFC 2616, раздел 10.4.13](https://python-all.ru/3.0/library/http.client.html) |
| `REQUEST_ENTITY_TOO_LARGE` | `413` | HTTP/1.1, [RFC 2616, раздел 10.4.14](https://python-all.ru/3.0/library/http.client.html) |
| `REQUEST_URI_TOO_LONG` | `414` | HTTP/1.1, [RFC 2616, раздел 10.4.15](https://python-all.ru/3.0/library/http.client.html) |
| `UNSUPPORTED_MEDIA_TYPE` | `415` | HTTP/1.1, [RFC 2616, раздел 10.4.16](https://python-all.ru/3.0/library/http.client.html) |
| `REQUESTED_RANGE_NOT_SATISFIABLE` | `416` | HTTP/1.1, [RFC 2616, раздел 10.4.17](https://python-all.ru/3.0/library/http.client.html) |
| `EXPECTATION_FAILED` | `417` | HTTP/1.1, [RFC 2616, раздел 10.4.18](https://python-all.ru/3.0/library/http.client.html) |
| `UNPROCESSABLE_ENTITY` | `422` | WEBDAV, [RFC 2518, раздел 10.3](https://python-all.ru/3.0/library/http.client.html) |
| `LOCKED` | `423` | WEBDAV [RFC 2518, раздел 10.4](https://python-all.ru/3.0/library/http.client.html) |
| `FAILED_DEPENDENCY` | `424` | WEBDAV, [RFC 2518, раздел 10.5](https://python-all.ru/3.0/library/http.client.html) |
| `UPGRADE_REQUIRED` | `426` | Обновление HTTP до TLS, [**RFC 2817**](https://python-all.ru/3.0/library/http.client.html), раздел 6 |
| `INTERNAL_SERVER_ERROR` | `500` | HTTP/1.1, [RFC 2616, раздел 10.5.1](https://python-all.ru/3.0/library/http.client.html) |
| `NOT_IMPLEMENTED` | `501` | HTTP/1.1, [RFC 2616, раздел 10.5.2](https://python-all.ru/3.0/library/http.client.html) |
| `BAD_GATEWAY` | `502` | HTTP/1.1 [RFC 2616, раздел 10.5.3](https://python-all.ru/3.0/library/http.client.html) |
| `SERVICE_UNAVAILABLE` | `503` | HTTP/1.1, [RFC 2616, раздел 10.5.4](https://python-all.ru/3.0/library/http.client.html) |
| `GATEWAY_TIMEOUT` | `504` | HTTP/1.1 [RFC 2616, раздел 10.5.5](https://python-all.ru/3.0/library/http.client.html) |
| `HTTP_VERSION_NOT_SUPPORTED` | `505` | HTTP/1.1, [RFC 2616, раздел 10.5.6](https://python-all.ru/3.0/library/http.client.html) |
| `INSUFFICIENT_STORAGE` | `507` | WEBDAV, [RFC 2518, раздел 10.6](https://python-all.ru/3.0/library/http.client.html) |
| `NOT_EXTENDED` | `510` | Расширение HTTP Framework, [**RFC 2774**](https://python-all.ru/3.0/library/http.client.html), раздел 7 |

#### `[http.client.responses]http.client.responses`

Этот словарь сопоставляет коды состояния HTTP 1.1 с названиями W3C.

Пример: `http.client.responses[http.client.NOT_FOUND]` – это `'Not Found'`.

## Объекты HTTPConnection

Экземпляры [`HTTPConnection`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPConnection) имеют следующие методы:

#### `[http.client.HTTPConnection.request]HTTPConnection.request(method, url[, body[, headers]])`

Этот метод отправляет запрос на сервер, используя HTTP-метод

*method*

и селектор

*url*

. Если аргумент

*body*

присутствует, он должен быть строкой с данными для отправки после заголовков. Или это может быть открытый файловый объект, в этом случае содержимое файла отправляется; этот файловый объект должен поддерживать методы

`fileno()`

и

`read()`

. Заголовок Content-Length устанавливается автоматически в правильное значение. Аргумент

*headers*

должен быть словарём дополнительных HTTP-заголовков для отправки вместе с запросом.

#### `[http.client.HTTPConnection.getresponse]HTTPConnection.getresponse()`

Должен вызываться после отправки запроса для получения ответа от сервера. Возвращает экземпляр [`HTTPResponse`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPResponse).

> **Примечание**
>
> Обратите внимание: необходимо прочитать весь ответ, прежде чем отправлять новый запрос на сервер.

#### `[http.client.HTTPConnection.set_debuglevel]HTTPConnection.set_debuglevel(level)`

Устанавливает уровень отладки (количество выводимой отладочной информации). Уровень отладки по умолчанию –

`0`

, то есть отладочная информация не выводится.

#### `[http.client.HTTPConnection.connect]HTTPConnection.connect()`

Подключается к серверу, указанному при создании объекта.

#### `[http.client.HTTPConnection.close]HTTPConnection.close()`

Закрывает соединение с сервером.

В качестве альтернативы описанному выше методу `request()` можно отправлять запрос пошагово, используя четыре функции ниже.

#### `[http.client.HTTPConnection.putrequest]HTTPConnection.putrequest(request, selector[, skip_host[, skip_accept_encoding]])`

Это должен быть первый вызов после установки соединения с сервером. Он отправляет серверу строку, состоящую из строки

*request*

, строки

*selector*

и версии HTTP (

`HTTP/1.1`

). Чтобы отключить автоматическую отправку заголовков

`Host:`

или

`Accept-Encoding:`

(например, для поддержки дополнительных кодировок содержимого), укажите

*skip\_host*

или

*skip\_accept\_encoding*

со значениями, отличными от False.

#### `[http.client.HTTPConnection.putheader]HTTPConnection.putheader(header, argument[, ...])`

Отправляет заголовок в стиле

[**RFC 822**](https://python-all.ru/3.0/library/http.client.html)

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

#### `[http.client.HTTPConnection.endheaders]HTTPConnection.endheaders()`

Отправляет пустую строку на сервер, сигнализируя об окончании заголовков.

#### `[http.client.HTTPConnection.send]HTTPConnection.send(data)`

Send data to the server. This should be used directly only after the

[`endheaders()`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPConnection.endheaders)

method has been called and before

[`getresponse()`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPConnection.getresponse)

is called.

## Объекты HTTPResponse

Экземпляры [`HTTPResponse`](https://python-all.ru/3.0/library/http.client.html#http.client.HTTPResponse) имеют следующие методы и атрибуты:

#### `[http.client.HTTPResponse.read]HTTPResponse.read([amt])`

Читает и возвращает тело ответа, или до следующих

*amt*

байт.

#### `[http.client.HTTPResponse.getheader]HTTPResponse.getheader(name[, default])`

Возвращает содержимое заголовка

*name*

или

*default*

, если соответствующий заголовок отсутствует.

#### `[http.client.HTTPResponse.getheaders]HTTPResponse.getheaders()`

Возвращает список кортежей (заголовок, значение).

#### `[http.client.HTTPResponse.msg]HTTPResponse.msg`

Экземпляр

[`email.message.Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message)

, содержащий заголовки ответа.

#### `[http.client.HTTPResponse.version]HTTPResponse.version`

Версия протокола HTTP, используемая сервером. 10 для HTTP/1.0, 11 для HTTP/1.1.

#### `[http.client.HTTPResponse.status]HTTPResponse.status`

Код состояния, возвращаемый сервером.

#### `[http.client.HTTPResponse.reason]HTTPResponse.reason`

Фраза причины, возвращаемая сервером.

## Примеры

Ниже приведён пример сеанса, использующего метод `GET`:

```python
>>> import http.client
>>> conn = http.client.HTTPConnection("www.python.org")
>>> conn.request("GET", "/index.html")
>>> r1 = conn.getresponse()
>>> print(r1.status, r1.reason)
200 OK
>>> data1 = r1.read()
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print(r2.status, r2.reason)
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
```

Ниже приведён пример сеанса, показывающий, как выполнять запросы `POST`:

```python
>>> import http.client, urllib.parse
>>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
...            "Accept": "text/plain"}
>>> conn = http.client.HTTPConnection("musi-cal.mojam.com:80")
>>> conn.request("POST", "/cgi-bin/query", params, headers)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200 OK
>>> data = response.read()
>>> conn.close()
```
