http.client — Клиент протокола HTTP
Исходный код: Lib/http/client.py
В этом модуле определены классы, реализующие клиентскую часть протоколов HTTP и HTTPS. Обычно он не используется напрямую — модуль urllib.request использует его для обработки URL-адресов, использующих HTTP и HTTPS.
См. также
Для более высокоуровневого интерфейса HTTP-клиента рекомендуется использовать пакет Requests.
Примечание
Поддержка HTTPS доступна только если Python был скомпилирован с поддержкой SSL (через модуль ssl).
Доступность: не Emscripten, не WASI.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Подробнее см. Платформы WebAssembly.
Модуль предоставляет следующие классы:
-
class http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None, blocksize=8192) -
Экземпляр
HTTPConnectionпредставляет одну транзакцию с HTTP-сервером. Он должен быть инициализирован, передав ему хост и необязательный номер порта. Если номер порта не передан, порт извлекается из строки хоста, если она имеет видhost:port, иначе используется стандартный порт HTTP (80). Если задан необязательный параметр timeout, блокирующие операции (например, попытки подключения) будут прерваны по истечении заданного количества секунд (если он не задан, используется глобальная настройка таймаута). Необязательный параметр source_address может быть кортежем (хост, порт) для использования в качестве адреса источника HTTP-соединения. Необязательный параметр blocksize задает размер буфера в байтах для отправки тела сообщения в формате «файл-подобный».Например, следующие вызовы создают экземпляры, которые подключаются к серверу на том же хосте и порту:
>>> h1 = http.client.HTTPConnection('www.python.org') >>> h2 = http.client.HTTPConnection('www.python.org:80') >>> h3 = http.client.HTTPConnection('www.python.org', 80) >>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)Изменено в версии 3.2: Добавлен параметр source_address.
Изменено в версии 3.4: Параметр strict удалён. HTTP-стили «Простые ответы» версии 0.9 больше не поддерживаются.
Изменено в версии 3.7: Добавлен параметр blocksize.
-
class http.client.HTTPSConnection(host, port=None, *, [timeout, ]source_address=None, context=None, blocksize=8192) -
Подкласс
HTTPConnection, использующий SSL для связи с защищёнными серверами. Стандартный порт —443. Если указан параметр context, он должен быть экземпляромssl.SSLContext, описывающим различные параметры SSL.Дополнительную информацию о лучших практиках см. в разделе Учитываемые аспекты безопасности.
Изменено в версии 3.2: Добавлены параметры source_address, context и check_hostname.
Изменено в версии 3.2: Этот класс теперь поддерживает виртуальные хосты HTTPS, если это возможно (то есть, если
ssl.HAS_SNIистинно).Изменено в версии 3.4: Параметр strict удалён. HTTP-стили «Простые ответы» версии 0.9 больше не поддерживаются.
Изменено в версии 3.4.3: Этот класс теперь по умолчанию выполняет все необходимые проверки сертификатов и имён хостов. Чтобы вернуться к предыдущему, не проверенному, поведению
ssl._create_unverified_context(), можно передать в параметр context.Изменено в версии 3.8: Этот класс теперь включает TLS 1.3
ssl.SSLContext.post_handshake_authдля стандартного context или при передаче cert_file с пользовательским context.Изменено в версии 3.10: Этот класс теперь отправляет расширение ALPN с индикатором протокола
http/1.1, когда context не задан. Пользовательский context должен устанавливать ALPN-протоколы с помощьюset_alpn_protocols().Изменено в версии 3.12: Устаревшие параметры key_file, cert_file и check_hostname удалены.
-
class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None) -
Класс, экземпляры которого возвращаются при успешном подключении. Пользователь не создаёт экземпляры напрямую.
Изменено в версии 3.4: Параметр strict удалён. HTTP-стили «Простые ответы» версии 0.9 больше не поддерживаются.
Этот модуль предоставляет следующую функцию:
-
http.client.parse_headers(fp) -
Парсит заголовки из указателя на файл fp, представляющего HTTP-запрос/ответ. Файл должен быть читателем
BufferedIOBase(то есть не текстовым) и должен предоставлять корректный заголовок в формате RFC 2822.Эта функция возвращает экземпляр
http.client.HTTPMessage, который содержит поля заголовков, но без полезной нагрузки (то же самое, чтоHTTPResponse.msgиhttp.server.BaseHTTPRequestHandler.headers). После возврата указатель на файл fp готов к чтению тела HTTP.Примечание
parse_headers()не парсит строку состояния HTTP-сообщения; он парсит толькоName: valueстроки. Файл должен быть готов к чтению этих строк полей, поэтому первая строка должна быть уже обработана перед вызовом функции.
При необходимости возбуждаются следующие исключения:
-
exception http.client.HTTPException -
Базовый класс других исключений в этом модуле. Это подкласс
Exception.
-
exception http.client.NotConnected -
Подкласс
HTTPException.
-
exception http.client.InvalidURL -
Подкласс
HTTPException, возбуждаемый, если порт задан и является нечисловым или пустым.
-
exception http.client.UnknownProtocol -
Подкласс
HTTPException.
-
exception http.client.UnknownTransferEncoding -
Подкласс
HTTPException.
-
exception http.client.UnimplementedFileMode -
Подкласс
HTTPException.
-
exception http.client.IncompleteRead -
Подкласс
HTTPException.
-
exception http.client.ImproperConnectionState -
Подкласс
HTTPException.
-
exception http.client.CannotSendRequest -
Подкласс
ImproperConnectionState.
-
exception http.client.CannotSendHeader -
Подкласс
ImproperConnectionState.
-
exception http.client.ResponseNotReady -
Подкласс
ImproperConnectionState.
-
exception http.client.BadStatusLine -
Подкласс
HTTPException. Возникает, если сервер отвечает HTTP-кодом состояния, который мы не понимаем.
-
exception http.client.LineTooLong -
Подкласс
HTTPException. Возникает, если от сервера получена чрезмерно длинная строка в HTTP-протоколе.
-
exception http.client.RemoteDisconnected -
Подкласс
ConnectionResetErrorиBadStatusLine. Возникает вHTTPConnection.getresponse(), когда попытка чтения ответа приводит к отсутствию считанных данных из соединения, что указывает на закрытие соединения удалённым концом.Добавлен в версии 3.5: Ранее,
BadStatusLine('')возникала ошибка.
В этом модуле определены следующие константы:
-
http.client.HTTP_PORT -
Порт по умолчанию для HTTP-протокола (всегда
80).
-
http.client.HTTPS_PORT -
Порт по умолчанию для HTTPS-протокола (всегда
443).
-
http.client.responses -
Этот словарь сопоставляет HTTP 1.1 коды состояния с именами W3C.
Пример:
http.client.responses[http.client.NOT_FOUND]это'Not Found'.
См. HTTP коды состояния для списка HTTP кодов состояния, доступных в этом модуле в качестве констант.
Объекты HTTPConnection
HTTPConnection имеют следующие методы:
-
HTTPConnection.request(method, url, body=None, headers={}, *, encode_chunked=False) -
Этот метод отправляет запрос на сервер с использованием HTTP-метода запроса method и URI запроса url. Указанный url должен быть абсолютным путем, соответствующим RFC 2616 §5.1.2 (если не подключаетесь к прокси-серверу HTTP или не используете методы
OPTIONSилиCONNECT).Если указан параметр body, то указанные данные отправляются после завершения заголовков. Это может быть
str, объект-подобный байтам, открытый объект файла или итерируемый объектbytes. Если body — строка, она кодируется как ISO-8859-1, что является значением по умолчанию для HTTP. Если это объект-подобный байтам, байты отправляются как есть. Если это объект файла, содержимое файла отправляется; этот объект файла должен поддерживать методread(). Если объект файла является экземпляромio.TextIOBase, данные, возвращаемые методомread(), будут закодированы как ISO-8859-1, в противном случае данные, возвращаемые методомread(), отправляются как есть. Если body — итерируемый объект, элементы итерируемого объекта отправляются как есть, пока итератор не исчерпается.Параметр headers должен быть отображением дополнительных HTTP-заголовков, которые необходимо отправить с запросом. Заголовок Host должен быть предоставлен для соответствия RFC 2616 §5.1.2 (если не подключаетесь к прокси-серверу HTTP или не используете методы
OPTIONSилиCONNECT).Если headers не содержит ни Content-Length, ни Transfer-Encoding, но есть тело запроса, одно из этих полей заголовка будет добавлено автоматически. Если body —
None, заголовок Content-Length устанавливается в0для методов, которые ожидают тело (PUT,POSTиPATCH). Если body — строка или объект-подобный байтам, который также не является файлом, заголовок Content-Length устанавливается в соответствии с его длиной. Любой другой тип body (файлы и итерируемые объекты в целом) будут кодироваться в формате chunk, и вместо заголовка Content-Length автоматически будет установлен заголовок Transfer-Encoding.Параметр encode_chunked имеет значение только если Transfer-Encoding указан в headers. Если encode_chunked —
False, объект HTTPConnection предполагает, что все кодирование обрабатывается вызывающим кодом. Если он равенTrue, тело будет закодировано в формате chunk.Например, чтобы выполнить запрос
GETкhttps://docs.python.org/3/:>>> import http.client >>> host = "docs.python.org" >>> conn = http.client.HTTPSConnection(host) >>> conn.request("GET", "/3/", headers={"Host": host}) >>> response = conn.getresponse() >>> print(response.status, response.reason) 200 OKПримечание
Кодирование фрагментированных данных было добавлено в протокол HTTP версии 1.1. Если известно, что HTTP-сервер обрабатывает HTTP 1.1, вызывающий код должен либо указать Content-Length, либо передать
strили объект-подобный байтам, который не является файлом, в качестве представления тела.Изменено в версии 3.2: body теперь может быть итерируемым объектом.
Изменено в версии 3.6: Если ни Content-Length, ни Transfer-Encoding не установлены в headers, файлы и итерируемые объекты body теперь кодируются в формате chunk. Добавлен параметр encode_chunked. Не производится попыток определить Content-Length для файлов.
-
HTTPConnection.getresponse() -
Должен вызываться после отправки запроса для получения ответа от сервера. Возвращает экземпляр
HTTPResponse.Примечание
Обратите внимание, что необходимо прочитать весь ответ, прежде чем можно отправить новый запрос на сервер.
Изменено в версии 3.5: Если возникает ошибка
ConnectionErrorили ее подкласс, объектHTTPConnectionбудет готов к повторному подключению при отправке нового запроса.
-
HTTPConnection.set_debuglevel(level) -
Установить уровень отладки. По умолчанию уровень отладки равен
0, что означает, что вывод отладки не отображается. Любое значение, большее0, приведет к выводу всего текущего вывода отладки в стандартный поток вывода. Значениеdebuglevelпередается всем новым объектамHTTPResponse, которые создаются.Добавлена в версии 3.1.
-
HTTPConnection.set_tunnel(host, port=None, headers=None) -
Установить хост и порт для туннелирования HTTP Connect. Это позволяет выполнить подключение через прокси-сервер.
Параметры host и port указывают конечную точку туннелированного подключения (т.е. адрес, включенный в запрос CONNECT, а не адрес прокси-сервера).
Параметр headers должен быть отображением дополнительных HTTP-заголовков, которые необходимо отправить с запросом CONNECT.
Поскольку для туннелирования HTTP CONNECT используется HTTP/1.1, согласно RFC RFC, необходимо указать заголовок HTTP
Host:, соответствующий форме authority запроса, предоставленной в качестве пункта назначения для запроса CONNECT. Если заголовок HTTPHost:не указан в параметре headers, он генерируется и передается автоматически.Например, чтобы выполнить туннелирование через HTTPS-прокси-сервер, работающий локально на порту 8080, мы должны передать адрес прокси-сервера в конструктор
HTTPSConnection, а адрес хоста, к которому мы в конечном итоге хотим подключиться, — в методset_tunnel():>>> import http.client >>> conn = http.client.HTTPSConnection("localhost", 8080) >>> conn.set_tunnel("www.python.org") >>> conn.request("HEAD","/index.html")Добавлена в версии 3.2.
Изменено в версии 3.12: Запросы HTTP CONNECT tunnelling используют протокол HTTP/1.1, обновленный с протокола HTTP/1.0.
Host:HTTP-заголовки являются обязательными для HTTP/1.1, поэтому один будет автоматически сгенерирован и передан, если не указан в аргументе headers.
-
HTTPConnection.get_proxy_response_headers() -
Возвращает словарь с заголовками ответа, полученного от прокси-сервера на запрос CONNECT.
Если запрос CONNECT не отправлялся, метод возвращает
None.Добавлена в версии 3.12.
-
HTTPConnection.connect() -
Подключиться к серверу, указанному при создании объекта. По умолчанию вызывается автоматически при выполнении запроса, если клиенту еще нет подключения.
Вызывает событие отладки отладки
http.client.connectс аргументамиself,host,port.
-
HTTPConnection.close() -
Закрыть подключение к серверу.
-
HTTPConnection.blocksize -
Размер буфера в байтах для отправки тела сообщения, похожего на файл.
Добавлена в версии 3.7.
В качестве альтернативы методу request(), описанному выше, можно также отправлять запросы поэтапно, используя четыре функции ниже.
-
HTTPConnection.putrequest(method, url, skip_host=False, skip_accept_encoding=False) -
Должен быть первым вызовом после подключения к серверу. Отправляет строку на сервер, состоящую из строки method, строки url и версии HTTP (
HTTP/1.1). Чтобы отключить автоматическую отправку заголовковHost:илиAccept-Encoding:(например, для приема дополнительных кодировок содержимого), укажите skip_host или skip_accept_encoding с ненулевыми значениями.
-
HTTPConnection.putheader(header, argument[, ...]) -
Отправить заголовок в стиле RFC 822 на сервер. Отправляет строку на сервер, содержащую заголовок, двоеточие и пробел, а также первый аргумент. Если указано больше аргументов, отправляются строки продолжения, каждая из которых состоит из табуляции и аргумента.
-
HTTPConnection.endheaders(message_body=None, *, encode_chunked=False) -
Отправьте пустую строку серверу, сигнализируя о конце заголовков. Дополнительный аргумент message_body может быть использован для передачи тела сообщения, связанного с запросом.
Если encode_chunked равно
True, результат каждой итерации message_body будет кодироваться по частям, как указано в RFC 7230, раздел 3.3.1. Способ кодирования данных зависит от типа message_body. Если message_body реализует интерфейс буферный интерфейс, кодирование приведет к одному блоку. Если message_body —collections.abc.Iterable, каждая итерация message_body приведет к блоку. Если message_body — объект файла, каждый вызов.read()приведет к блоку. Метод автоматически сигнализирует о конце данных, закодированных по частям, сразу после message_body.Примечание
Из-за спецификации кодирования по частям пустые блоки, сгенерированные итератором тела, будут игнорироваться кодировщиком блоков. Это делается для предотвращения преждевременной остановки чтения запроса целевым сервером из-за неправильного кодирования.
Изменено в версии 3.6: Добавлена поддержка кодирования по частям и параметр encode_chunked.
-
HTTPConnection.send(data) -
Отправить данные на сервер. Это следует использовать напрямую только после вызова метода
endheaders()и перед вызовомgetresponse().Вызывает событие аудита
http.client.sendс аргументамиself,data.
Объекты HTTPResponse
Объект HTTPResponse оборачивает HTTP-ответ от сервера. Он предоставляет доступ к заголовкам запроса и телу сущности. Ответ — это итерируемый объект и может быть использован в операторе with.
Изменено в версии 3.5: Теперь реализован интерфейс io.BufferedIOBase, и все его операции чтения поддерживаются.
-
HTTPResponse.read([amt]) -
Считывает и возвращает тело ответа или до следующих amt байтов.
-
HTTPResponse.readinto(b) -
Считывает до следующих len(b) байтов тела ответа в буфер b. Возвращает количество считанных байтов.
Добавлен в версии 3.3.
-
HTTPResponse.getheader(name, default=None) -
Возвращает значение заголовка name или default, если нет заголовка, соответствующего name. Если существует более одного заголовка с именем name, возвращает все значения, соединенные запятыми. Если default — любой итерируемый объект, кроме одной строки, его элементы аналогичным образом возвращаются, соединенные запятыми.
-
HTTPResponse.getheaders() -
Возвращает список кортежей (заголовок, значение).
-
HTTPResponse.fileno() -
Возвращает
filenoосновного сокета.
-
HTTPResponse.msg -
Объект
http.client.HTTPMessage, содержащий заголовки ответа.http.client.HTTPMessage— подклассemail.message.Message.
-
HTTPResponse.version -
Версия протокола HTTP, используемая сервером. 10 для HTTP/1.0, 11 для HTTP/1.1.
-
HTTPResponse.url -
URL ресурса, полученного, обычно используется для определения, был ли выполнен редирект.
-
HTTPResponse.headers -
Заголовки ответа в виде объекта
email.message.EmailMessage.
-
HTTPResponse.status -
Код состояния, возвращённый сервером.
-
HTTPResponse.reason -
Фраза причины, возвращённая сервером.
-
HTTPResponse.debuglevel -
Отладка. Если
debuglevelбольше нуля, сообщения будут выводиться в стандартный вывод по мере чтения и разбора ответа.
-
HTTPResponse.closed -
Является
True, если поток закрыт.
-
HTTPResponse.geturl() -
Устарело начиная с версии 3.9: Устарел в пользу
url.
-
HTTPResponse.info() -
Устарело начиная с версии 3.9: Устарел в пользу
headers.
-
HTTPResponse.getcode() -
Устарело начиная с версии 3.9: Устарел в пользу
status.
Примеры
Вот пример сессии, использующей метод GET:
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print(r1.status, r1.reason)
200 OK
>>> data1 = r1.read() # This will return entire content.
>>> # The following example demonstrates reading data in chunks.
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> while chunk := r1.read(200):
... print(repr(chunk))
b'<!doctype html>\n<!--[if"...
...
>>> # Example of an invalid request
>>> conn = http.client.HTTPSConnection("docs.python.org")
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print(r2.status, r2.reason)
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
Вот пример сессии, использующей метод HEAD. Обратите внимание, что метод HEAD никогда не возвращает данных.
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("HEAD", "/")
>>> res = conn.getresponse()
>>> print(res.status, res.reason)
200 OK
>>> data = res.read()
>>> print(len(data))
0
>>> data == b''
True
Вот пример сессии, использующей метод POST:
>>> import http.client, urllib.parse
>>> params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
... "Accept": "text/plain"}
>>> conn = http.client.HTTPConnection("bugs.python.org")
>>> conn.request("POST", "", params, headers)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
302 Found
>>> data = response.read()
>>> data
b'Redirecting to <a href="https://bugs.python.org/issue12524">https://bugs.python.org/issue12524</a>'
>>> conn.close()
HTTP-запросы со стороны клиента PUT очень похожи на запросы POST. Разница заключается только в том, что серверные части, где HTTP-серверы разрешат создание ресурсов с помощью запросов PUT. Следует отметить, что пользовательские HTTP-методы также обрабатываются в urllib.request.Request путём установки соответствующего атрибута метода. Вот пример сессии, использующей метод PUT:
>>> # This creates an HTTP request
>>> # with the content of BODY as the enclosed representation
>>> # for the resource http://localhost:8080/file
...
>>> import http.client
>>> BODY = "***filecontents***"
>>> conn = http.client.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200, OK
Объекты HTTPMessage
-
class http.client.HTTPMessage(email.message.Message)
Объект http.client.HTTPMessage содержит заголовки из HTTP-ответа. Он реализован с использованием класса email.message.Message.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/http.client.html