http.client — клиент протокола HTTP
Исходный код: Lib/http/client.py
Этот модуль определяет классы, реализующие клиентскую часть протоколов HTTP и HTTPS. Обычно он не используется напрямую — модуль urllib.request использует его для обработки URL-адресов, использующих HTTP и HTTPS.
См. также
Для более высокоуровневого интерфейса HTTP-клиента рекомендуется использовать пакет Requests.
Примечание
Поддержка HTTPS доступна, только если Python был собран с поддержкой SSL (через модуль ssl).
Доступность: недоступен в WASI.
Этот модуль не работает или недоступен в WebAssembly. Дополнительные сведения см. в разделе Платформы 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имеет значение true).Изменено в версии 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: Если параметр context не задан, этот класс теперь отправляет расширение ALPN с индикатором протокола
http/1.1. В пользовательском 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 5322.Эта функция возвращает экземпляр
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. Чтобы соответствовать требованиям RFC 2616 §5.1.2, переданный url должен быть абсолютным путём (за исключением случаев подключения к HTTP-прокси-серверу или использования методов
OPTIONSилиCONNECT).Если указан body, заданные данные отправляются после завершения передачи заголовков. Это может быть
str, объект, подобный байтам, открытый файловый объект или итерируемый объект, содержащийbytes. Если body — строка, она кодируется в ISO-8859-1, кодировку HTTP по умолчанию. Если это объект, подобный байтам, байты отправляются без изменений. Если это файловый объект, отправляется содержимое файла; такой файловый объект должен поддерживать как минимум методread(). Если файловый объект является экземпляромio.TextIOBase, данные, возвращаемые методомread(), будут закодированы в ISO-8859-1; в противном случае данные, возвращаемые методомread(), отправляются без изменений. Если body — итерируемый объект, его элементы отправляются без изменений до исчерпания объекта.Аргумент headers должен быть отображением дополнительных заголовков HTTP, отправляемых вместе с запросом. Для соответствия требованиям RFC 2616 §14.23 необходимо передать заголовок Host (за исключением случаев подключения к HTTP-прокси-серверу или использования методов
OPTIONSилиCONNECT).Если headers не содержит ни Content-Length, ни Transfer-Encoding, но тело запроса есть, одно из этих полей заголовка будет добавлено автоматически. Если body имеет значение
None, для методов, предполагающих наличие тела (PUT,POSTиPATCH), заголовку Content-Length присваивается значение0. Если body — строка или объект, подобный байтам, но не являющийся при этом файлом, заголовку Content-Length присваивается его длина. Все остальные типы body (файлы и итерируемые объекты в целом) передаются с кодированием по частям, и вместо Content-Length автоматически задаётся заголовок Transfer-Encoding.Аргумент encode_chunked имеет значение только в том случае, если в headers указан Transfer-Encoding. Если encode_chunked имеет значение
False, объект HTTPConnection предполагает, что кодирование выполняет вызывающий код. Если значение —True, тело будет закодировано по частям.Например, чтобы выполнить запрос
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Примечание
Передача с кодированием по частям добавлена в версию 1.1 протокола HTTP. Если неизвестно, поддерживает ли HTTP-сервер HTTP 1.1, вызывающий код должен либо указать Content-Length, либо передать в качестве тела
strили объект, подобный байтам, который не является файлом.Примечание
Обратите внимание: прежде чем отправлять серверу новый запрос, необходимо прочитать весь ответ или вызвать
close(), еслиgetresponse()возбудил исключение, не являющееся подклассомConnectionError.Изменено в версии 3.2: Теперь body может быть итерируемым объектом.
Изменено в версии 3.6: Если в headers не заданы ни Content-Length, ни Transfer-Encoding, объекты body, представляющие файлы и итерируемые объекты, теперь передаются с кодированием по частям. Добавлен аргумент encode_chunked. Для файловых объектов длина Content-Length не определяется.
-
HTTPConnection.getresponse() -
Вызывается после отправки запроса для получения ответа от сервера. Возвращает экземпляр
HTTPResponse.Изменено в версии 3.5: Если возбуждается исключение
ConnectionErrorили его подкласс, объектHTTPConnectionбудет готов к повторному подключению при отправке нового запроса.Обратите внимание, что это не относится к исключениям
OSError, возбуждаемым базовым сокетом. В этом случае вызывающий код должен вызватьclose()для существующего соединения.
-
HTTPConnection.set_debuglevel(level) -
Задаёт уровень отладки. Уровень отладки по умолчанию —
0, то есть отладочные сообщения не выводятся. Любое значение больше0приводит к выводу всех определённых на данный момент отладочных сообщений в stdout. Значение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 должен быть указан заголовок HTTP
Host:, соответствующий форме полномочий цели запроса, заданной как адрес назначения запроса 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-туннеля теперь используется протокол HTTP/1.1 вместо HTTP/1.0. Для HTTP/1.1 обязательны заголовки HTTP
Host:, поэтому они будут созданы и отправлены автоматически, если не указаны в аргументе 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 значения, отличные от False.
-
HTTPConnection.putheader(header, argument[, ...]) -
Отправляет серверу заголовок в стиле RFC 822. Серверу отправляется строка, состоящая из заголовка, двоеточия, пробела и первого аргумента. Если передано больше аргументов, отправляются строки продолжения, каждая из которых состоит из символа табуляции и аргумента.
-
HTTPConnection.endheaders(message_body=None, *, encode_chunked=False) -
Отправляет серверу пустую строку, обозначающую конец заголовков. Необязательный аргумент message_body можно использовать для передачи тела сообщения, связанного с запросом.
Если encode_chunked имеет значение
True, результат каждой итерации по message_body будет закодирован по частям, как указано в разделе 3.3.1 RFC 7230. Способ кодирования данных зависит от типа 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больше нуля, сообщения будут выводиться в stdout по мере чтения и разбора ответа.
-
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 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/http.client.html