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

http.client.md

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

1> **Источник:** https://python-all.ru/3.1/library/http.client.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.10. `http.client` – клиент протокола HTTP89Этот модуль определяет классы, реализующие клиентскую сторону протоколов HTTP и HTTPS. Обычно он не используется напрямую – модуль [`urllib.request`](https://python-all.ru/3.1/library/urllib.request.html#module-urllib.request) применяет его для обработки URL, использующих HTTP и HTTPS.1011> **Примечание**12>13> Поддержка HTTPS доступна только в том случае, если модуль [`socket`](https://python-all.ru/3.1/library/socket.html#module-socket) был скомпилирован с поддержкой SSL.1415Модуль предоставляет следующие классы:1617#### `class http.client.HTTPConnection(host, port=None, strict=None[, timeout])`1819Экземпляр [`HTTPConnection`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPConnection) представляет одну транзакцию с HTTP-сервером. Его следует создавать, передавая хост и необязательный номер порта. Если номер порта не передан, порт извлекается из строки хоста, если она имеет вид `host:port`; в противном случае используется порт HTTP по умолчанию (80). Если True, необязательный параметр *strict* (по умолчанию ложное значение) вызывает `BadStatusLine`, если строка состояния не может быть разобрана как допустимая строка состояния HTTP/1.0 или 1.1. Если задан необязательный параметр *timeout*, блокирующие операции (например, попытки соединения) будут прерваны по истечении этого количества секунд (если он не задан, используется глобальная настройка таймаута по умолчанию).2021Например, следующие вызовы создают экземпляры, подключающиеся к одному и тому же серверу по одному и тому же хосту и порту:2223```python24>>> h1 = http.client.HTTPConnection('www.cwi.nl')25>>> h2 = http.client.HTTPConnection('www.cwi.nl:80')26>>> h3 = http.client.HTTPConnection('www.cwi.nl', 80)27>>> h3 = http.client.HTTPConnection('www.cwi.nl', 80, timeout=10)28```2930#### `class http.client.HTTPSConnection(host, port=None, key_file=None, cert_file=None, strict=None[, timeout])`3132Подкласс [`HTTPConnection`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPConnection), который использует SSL для связи с безопасными серверами. Порт по умолчанию – `443`. *key\_file* – это имя файла в формате PEM, содержащего ваш закрытый ключ, а *cert\_file* – это файл цепочки сертификатов в формате PEM; оба могут использоваться для аутентификации на сервере.3334> **Предупреждение**35>36> Это не выполняет никакой проверки сертификата сервера.3738#### `class http.client.HTTPResponse(sock, debuglevel=0, strict=0, method=None, url=None)`3940Класс, экземпляры которого возвращаются при успешном соединении. Не создаётся напрямую пользователем.4142При необходимости генерируются следующие исключения:4344#### `exception http.client.HTTPException`4546Базовый класс остальных исключений этого модуля. Является подклассом4748[`Exception`](https://python-all.ru/3.1/library/exceptions.html#Exception)4950.5152#### `exception http.client.NotConnected`5354Подкласс5556[`HTTPException`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPException)5758.5960#### `exception http.client.InvalidURL`6162Подкласс6364[`HTTPException`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPException)6566; возбуждается, если указан порт, но он не является числом или пуст.6768#### `exception http.client.UnknownProtocol`6970Подкласс7172[`HTTPException`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPException)7374.7576#### `exception http.client.UnknownTransferEncoding`7778Подкласс7980[`HTTPException`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPException)8182.8384#### `exception http.client.UnimplementedFileMode`8586Подкласс8788[`HTTPException`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPException)8990.9192#### `exception http.client.IncompleteRead`9394Подкласс9596[`HTTPException`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPException)9798.99100#### `exception http.client.ImproperConnectionState`101102Подкласс103104[`HTTPException`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPException)105106.107108#### `exception http.client.CannotSendRequest`109110Подкласс111112[`ImproperConnectionState`](https://python-all.ru/3.1/library/http.client.html#http.client.ImproperConnectionState)113114.115116#### `exception http.client.CannotSendHeader`117118Подкласс119120[`ImproperConnectionState`](https://python-all.ru/3.1/library/http.client.html#http.client.ImproperConnectionState)121122.123124#### `exception http.client.ResponseNotReady`125126Подкласс127128[`ImproperConnectionState`](https://python-all.ru/3.1/library/http.client.html#http.client.ImproperConnectionState)129130.131132#### `exception http.client.BadStatusLine`133134Подкласс135136[`HTTPException`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPException)137138. Возникает, если сервер отвечает кодом состояния HTTP, который не удаётся распознать.139140Константы, определённые в этом модуле:141142#### `http.client.HTTP_PORT`143144Порт по умолчанию для протокола HTTP (всегда145146`80`147148).149150#### `http.client.HTTPS_PORT`151152Порт по умолчанию для протокола HTTPS (всегда153154`443`155156).157158а также следующие константы для целочисленных кодов состояния:159160| Константа | Значение | Определение |161| --- | --- | --- |162| `CONTINUE` | `100` | HTTP/1.1, [RFC 2616, раздел 10.1.1](https://python-all.ru/3.1/library/http.client.html) |163| `SWITCHING_PROTOCOLS` | `101` | HTTP/1.1, [RFC 2616, раздел 10.1.2](https://python-all.ru/3.1/library/http.client.html) |164| `PROCESSING` | `102` | WEBDAV, [RFC 2518, раздел 10.1](https://python-all.ru/3.1/library/http.client.html) |165| `OK` | `200` | HTTP/1.1, [RFC 2616, раздел 10.2.1](https://python-all.ru/3.1/library/http.client.html) |166| `CREATED` | `201` | HTTP/1.1, [RFC 2616, раздел 10.2.2](https://python-all.ru/3.1/library/http.client.html) |167| `ACCEPTED` | `202` | HTTP/1.1, [RFC 2616, раздел 10.2.3](https://python-all.ru/3.1/library/http.client.html) |168| `NON_AUTHORITATIVE_INFORMATION` | `203` | HTTP/1.1, [RFC 2616, раздел 10.2.4](https://python-all.ru/3.1/library/http.client.html) |169| `NO_CONTENT` | `204` | HTTP/1.1, [RFC 2616, раздел 10.2.5](https://python-all.ru/3.1/library/http.client.html) |170| `RESET_CONTENT` | `205` | HTTP/1.1, [RFC 2616, раздел 10.2.6](https://python-all.ru/3.1/library/http.client.html) |171| `PARTIAL_CONTENT` | `206` | HTTP/1.1, [RFC 2616, раздел 10.2.7](https://python-all.ru/3.1/library/http.client.html) |172| `MULTI_STATUS` | `207` | WEBDAV [RFC 2518, раздел 10.2](https://python-all.ru/3.1/library/http.client.html) |173| `IM_USED` | `226` | Дельта-кодирование в HTTP, [**RFC 3229**](https://python-all.ru/3.1/library/http.client.html), раздел 10.4.1 |174| `MULTIPLE_CHOICES` | `300` | HTTP/1.1, [RFC 2616, раздел 10.3.1](https://python-all.ru/3.1/library/http.client.html) |175| `MOVED_PERMANENTLY` | `301` | HTTP/1.1, [RFC 2616, раздел 10.3.2](https://python-all.ru/3.1/library/http.client.html) |176| `FOUND` | `302` | HTTP/1.1, [RFC 2616, раздел 10.3.3](https://python-all.ru/3.1/library/http.client.html) |177| `SEE_OTHER` | `303` | HTTP/1.1, [RFC 2616, раздел 10.3.4](https://python-all.ru/3.1/library/http.client.html) |178| `NOT_MODIFIED` | `304` | HTTP/1.1, [RFC 2616, раздел 10.3.5](https://python-all.ru/3.1/library/http.client.html) |179| `USE_PROXY` | `305` | HTTP/1.1, [RFC 2616, раздел 10.3.6](https://python-all.ru/3.1/library/http.client.html) |180| `TEMPORARY_REDIRECT` | `307` | HTTP/1.1, [RFC 2616, раздел 10.3.8](https://python-all.ru/3.1/library/http.client.html) |181| `BAD_REQUEST` | `400` | HTTP/1.1, [RFC 2616, раздел 10.4.1](https://python-all.ru/3.1/library/http.client.html) |182| `UNAUTHORIZED` | `401` | HTTP/1.1, [RFC 2616, раздел 10.4.2](https://python-all.ru/3.1/library/http.client.html) |183| `PAYMENT_REQUIRED` | `402` | HTTP/1.1, [RFC 2616, раздел 10.4.3](https://python-all.ru/3.1/library/http.client.html) |184| `FORBIDDEN` | `403` | HTTP/1.1, [RFC 2616, раздел 10.4.4](https://python-all.ru/3.1/library/http.client.html) |185| `NOT_FOUND` | `404` | HTTP/1.1, [RFC 2616, раздел 10.4.5](https://python-all.ru/3.1/library/http.client.html) |186| `METHOD_NOT_ALLOWED` | `405` | HTTP/1.1, [RFC 2616, раздел 10.4.6](https://python-all.ru/3.1/library/http.client.html) |187| `NOT_ACCEPTABLE` | `406` | HTTP/1.1, [RFC 2616, раздел 10.4.7](https://python-all.ru/3.1/library/http.client.html) |188| `PROXY_AUTHENTICATION_REQUIRED` | `407` | HTTP/1.1, [RFC 2616, раздел 10.4.8](https://python-all.ru/3.1/library/http.client.html) |189| `REQUEST_TIMEOUT` | `408` | HTTP/1.1, [RFC 2616, раздел 10.4.9](https://python-all.ru/3.1/library/http.client.html) |190| `CONFLICT` | `409` | HTTP/1.1, [RFC 2616, раздел 10.4.10](https://python-all.ru/3.1/library/http.client.html) |191| `GONE` | `410` | HTTP/1.1, [RFC 2616, раздел 10.4.11](https://python-all.ru/3.1/library/http.client.html) |192| `LENGTH_REQUIRED` | `411` | HTTP/1.1, [RFC 2616, раздел 10.4.12](https://python-all.ru/3.1/library/http.client.html) |193| `PRECONDITION_FAILED` | `412` | HTTP/1.1, [RFC 2616, раздел 10.4.13](https://python-all.ru/3.1/library/http.client.html) |194| `REQUEST_ENTITY_TOO_LARGE` | `413` | HTTP/1.1, [RFC 2616, раздел 10.4.14](https://python-all.ru/3.1/library/http.client.html) |195| `REQUEST_URI_TOO_LONG` | `414` | HTTP/1.1, [RFC 2616, раздел 10.4.15](https://python-all.ru/3.1/library/http.client.html) |196| `UNSUPPORTED_MEDIA_TYPE` | `415` | HTTP/1.1, [RFC 2616, раздел 10.4.16](https://python-all.ru/3.1/library/http.client.html) |197| `REQUESTED_RANGE_NOT_SATISFIABLE` | `416` | HTTP/1.1, [RFC 2616, раздел 10.4.17](https://python-all.ru/3.1/library/http.client.html) |198| `EXPECTATION_FAILED` | `417` | HTTP/1.1, [RFC 2616, раздел 10.4.18](https://python-all.ru/3.1/library/http.client.html) |199| `UNPROCESSABLE_ENTITY` | `422` | WEBDAV, [RFC 2518, раздел 10.3](https://python-all.ru/3.1/library/http.client.html) |200| `LOCKED` | `423` | WEBDAV [RFC 2518, раздел 10.4](https://python-all.ru/3.1/library/http.client.html) |201| `FAILED_DEPENDENCY` | `424` | WEBDAV, [RFC 2518, раздел 10.5](https://python-all.ru/3.1/library/http.client.html) |202| `UPGRADE_REQUIRED` | `426` | Обновление HTTP до TLS, [**RFC 2817**](https://python-all.ru/3.1/library/http.client.html), раздел 6 |203| `INTERNAL_SERVER_ERROR` | `500` | HTTP/1.1, [RFC 2616, раздел 10.5.1](https://python-all.ru/3.1/library/http.client.html) |204| `NOT_IMPLEMENTED` | `501` | HTTP/1.1, [RFC 2616, раздел 10.5.2](https://python-all.ru/3.1/library/http.client.html) |205| `BAD_GATEWAY` | `502` | HTTP/1.1 [RFC 2616, раздел 10.5.3](https://python-all.ru/3.1/library/http.client.html) |206| `SERVICE_UNAVAILABLE` | `503` | HTTP/1.1, [RFC 2616, раздел 10.5.4](https://python-all.ru/3.1/library/http.client.html) |207| `GATEWAY_TIMEOUT` | `504` | HTTP/1.1 [RFC 2616, раздел 10.5.5](https://python-all.ru/3.1/library/http.client.html) |208| `HTTP_VERSION_NOT_SUPPORTED` | `505` | HTTP/1.1, [RFC 2616, раздел 10.5.6](https://python-all.ru/3.1/library/http.client.html) |209| `INSUFFICIENT_STORAGE` | `507` | WEBDAV, [RFC 2518, раздел 10.6](https://python-all.ru/3.1/library/http.client.html) |210| `NOT_EXTENDED` | `510` | Расширение HTTP Framework, [**RFC 2774**](https://python-all.ru/3.1/library/http.client.html), раздел 7 |211212#### `http.client.responses`213214Этот словарь сопоставляет коды состояния HTTP 1.1 с названиями W3C.215216Пример: `http.client.responses[http.client.NOT_FOUND]` – это `'Not Found'`.217218## 20.10.1. Объекты HTTPConnection219220Экземпляры [`HTTPConnection`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPConnection) имеют следующие методы:221222#### `HTTPConnection.request(method, url, body=None, headers={})`223224Это отправляет запрос на сервер, используя метод HTTP-запроса *method* и селектор *url*. Если аргумент *body* присутствует, он должен быть строкой или объектом bytes с данными для отправки после завершения заголовков. Строки кодируются как ISO-8859-1, кодировка по умолчанию для HTTP. Для использования других кодировок передавайте объект bytes. Заголовок Content-Length устанавливается равным длине строки.225226Параметр *body* также может быть открытым [*файловым объектом*](https://python-all.ru/3.1/glossary.html#term-file-object), и в этом случае содержимое файла отправляется; такой файловый объект должен поддерживать `fileno()` и `read()`. Заголовок Content-Length автоматически устанавливается в длину файла, как сообщает stat.227228Аргумент *headers* должен быть отображением дополнительных HTTP-заголовков, отправляемых вместе с запросом.229230#### `HTTPConnection.getresponse()`231232Должен вызываться после отправки запроса для получения ответа от сервера. Возвращает экземпляр [`HTTPResponse`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPResponse).233234> **Примечание**235>236> Обратите внимание: необходимо прочитать весь ответ, прежде чем отправлять новый запрос на сервер.237238#### `HTTPConnection.set_debuglevel(level)`239240Устанавливает уровень отладки. Уровень отладки по умолчанию равен `0`, то есть отладочный вывод не производится. Любое значение больше `0` приведёт к выводу всех текущих определённых отладочных сообщений в stdout. `debuglevel` передаётся всем новым создаваемым объектам [`HTTPResponse`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPResponse).241242Новое в версии 3.1.243244#### `HTTPConnection.connect()`245246Подключается к серверу, указанному при создании объекта.247248#### `HTTPConnection.close()`249250Закрывает соединение с сервером.251252В качестве альтернативы описанному выше методу `request()` можно отправлять запрос пошагово, используя четыре функции ниже.253254#### `HTTPConnection.putrequest(request, selector, skip_host=False, skip_accept_encoding=False)`255256Это должен быть первый вызов после установки соединения с сервером. Он отправляет серверу строку, состоящую из строки257258*request*259260, строки261262*selector*263264и версии HTTP (265266`HTTP/1.1`267268). Чтобы отключить автоматическую отправку заголовков269270`Host:`271272или273274`Accept-Encoding:`275276(например, для поддержки дополнительных кодировок содержимого), укажите277278*skip\_host*279280или281282*skip\_accept\_encoding*283284со значениями, отличными от False.285286#### `HTTPConnection.putheader(header, argument[, ...])`287288Отправляет заголовок в стиле289290[**RFC 822**](https://python-all.ru/3.1/library/http.client.html)291292на сервер. Он отправляет строку, состоящую из заголовка, двоеточия, пробела и первого аргумента. Если заданы дополнительные аргументы, отправляются строки продолжения, каждая из которых состоит из табуляции и аргумента.293294#### `HTTPConnection.endheaders()`295296Отправляет пустую строку на сервер, сигнализируя об окончании заголовков.297298#### `HTTPConnection.send(data)`299300Send data to the server. This should be used directly only after the301302[`endheaders()`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPConnection.endheaders)303304method has been called and before305306[`getresponse()`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPConnection.getresponse)307308is called.309310## 20.10.2. Объекты HTTPResponse311312Экземпляр [`HTTPResponse`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPResponse) инкапсулирует HTTP-ответ от сервера. Он предоставляет доступ к заголовкам запроса и телу сущности. Ответ является итерируемым объектом и может использоваться в операторе with.313314#### `HTTPResponse.read([amt])`315316Читает и возвращает тело ответа, или до следующих317318*amt*319320байт.321322#### `HTTPResponse.getheader(name, default=None)`323324Возвращает значение заголовка325326*name*327328или329330*default*331332, если нет заголовка, соответствующего333334*name*335336. Если существует более одного заголовка с именем337338*name*339340, возвращает все значения, объединённые через ', '. Если 'default' является любым итерируемым объектом, отличным от одной строки, его элементы аналогично возвращаются объединёнными запятыми.341342#### `HTTPResponse.getheaders()`343344Возвращает список кортежей (заголовок, значение).345346#### `HTTPResponse.fileno()`347348Возвращает349350`fileno`351352нижележащего сокета.353354#### `HTTPResponse.msg`355356Экземпляр357358`http.client.HTTPMessage`359360, содержащий заголовки ответа.361362`http.client.HTTPMessage`363364является подклассом365366[`email.message.Message`](https://python-all.ru/3.1/library/email.message.html#email.message.Message)367368.369370#### `HTTPResponse.version`371372Версия протокола HTTP, используемая сервером. 10 для HTTP/1.0, 11 для HTTP/1.1.373374#### `HTTPResponse.status`375376Код состояния, возвращаемый сервером.377378#### `HTTPResponse.reason`379380Фраза причины, возвращаемая сервером.381382#### `HTTPResponse.debuglevel`383384Отладочный хук. Если385386[`debuglevel`](https://python-all.ru/3.1/library/http.client.html#http.client.HTTPResponse.debuglevel)387388больше нуля, сообщения будут выводиться в stdout по мере чтения и разбора ответа.389390## 20.10.3. Примеры391392Ниже приведён пример сеанса, использующего метод `GET`:393394```python395>>> import http.client396>>> conn = http.client.HTTPConnection("www.python.org")397>>> conn.request("GET", "/index.html")398>>> r1 = conn.getresponse()399>>> print(r1.status, r1.reason)400200 OK401>>> data1 = r1.read()402>>> conn.request("GET", "/parrot.spam")403>>> r2 = conn.getresponse()404>>> print(r2.status, r2.reason)405404 Not Found406>>> data2 = r2.read()407>>> conn.close()408```409410Вот пример сеанса, в котором используется метод `HEAD`. Обратите внимание, что метод `HEAD` никогда не возвращает никаких данных.411412```python413>>> import http.client414>>> conn = http.client.HTTPConnection("www.python.org")415>>> conn.request("HEAD","/index.html")416>>> res = conn.getresponse()417>>> print(res.status, res.reason)418200 OK419>>> data = res.read()420>>> print(len(data))4210422>>> data == b''423True424```425426Ниже приведён пример сеанса, показывающий, как выполнять запросы `POST`:427428```python429>>> import http.client, urllib.parse430>>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})431>>> headers = {"Content-type": "application/x-www-form-urlencoded",432...            "Accept": "text/plain"}433>>> conn = http.client.HTTPConnection("musi-cal.mojam.com:80")434>>> conn.request("POST", "/cgi-bin/query", params, headers)435>>> response = conn.getresponse()436>>> print(response.status, response.reason)437200 OK438>>> data = response.read()439>>> conn.close()440```441442## 20.10.4. Объекты HTTPMessage443444Экземпляр `http.client.HTTPMessage` содержит заголовки HTTP-ответа. Он реализован с помощью класса [`email.message.Message`](https://python-all.ru/3.1/library/email.message.html#email.message.Message).445