http.client — Клиент протокола HTTP
Исходный код: Lib/http/client.py
В данном модуле определены классы, реализующие клиентскую часть протоколов HTTP и HTTPS. Обычно к нему нет прямого доступа — модуль urllib.request использует его для обработки URL, использующих HTTP и HTTPS.
См. также
Для более высокого уровня интерфейса HTTP-клиента рекомендуется использовать пакет Requests.
Примечание
Поддержка HTTPS доступна только если Python был скомпилирован с поддержкой SSL (через модуль ssl).
Модуль предоставляет следующие классы:
-
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, key_file=None, cert_file=None, [timeout, ]source_address=None, *, context=None, check_hostname=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для контекста по умолчанию или при передаче cert_file с настраиваемым контекстом.Изменено в версии 3.10: Этот класс теперь отправляет расширение ALPN с индикатором протокола
http/1.1при отсутствии context. Пользовательский context должен устанавливать протоколы ALPN с помощьюset_alpn_protocol().Устарело начиная с версии 3.6: Параметры key_file и cert_file устарели в пользу context. Используйте
ssl.SSLContext.load_cert_chain()вместо этого или позвольтеssl.create_default_context()выбрать доверенные сертификаты CA системы.Параметр check_hostname также устарел; вместо него следует использовать атрибут
ssl.SSLContext.check_hostnameобъекта context.
-
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 и селектора url.
Если указан параметр body, указанные данные отправляются после завершения заголовков. Это может быть
str, объект, подобный байтам, открытый объект файла или итерируемый наборbytes. Если body — строка, она кодируется как ISO-8859-1, что является значением по умолчанию для HTTP. Если это объект, подобный байтам, байты отправляются как есть. Если это объект файла, содержимое файла отправляется; этот объект файла должен поддерживать методread(). Если объект файла является экземпляромio.TextIOBase, данные, возвращаемые методомread(), будут закодированы как ISO-8859-1, в противном случае данные, возвращаемыеread(), отправляются как есть. Если body — итерируемый объект, элементы итерируемого объекта отправляются как есть, пока итерируемый объект не будет исчерпан.Аргумент headers должен быть отображением дополнительных HTTP-заголовков, которые нужно отправить вместе с запросом.
Если headers не содержит ни Content-Length, ни Transfer-Encoding, но есть тело запроса, одно из этих полей заголовков будет добавлено автоматически. Если body —
None, заголовок Content-Length устанавливается в значение0для методов, которые ожидают тело (PUT,POST, иPATCH). Если body — строка или объект, подобный байтам, который также не является файлом, заголовок Content-Length устанавливается в его длину. Любой другой тип body (файлы и итерируемые объекты в общем случае) будут закодированы с помощью фрагментации, и вместо Content-Length автоматически будет установлен заголовок Transfer-Encoding.Аргумент encode_chunked имеет значение только в том случае, если в headers указан Transfer-Encoding. Если encode_chunked —
False, объект HTTPConnection предполагает, что все кодирование обрабатывается вызывающим кодом. Если этоTrue, тело будет закодировано с помощью фрагментации.Примечание
Кодирование фрагментов было добавлено в HTTP-протокол версии 1.1. Если известно, что HTTP-сервер обрабатывает HTTP 1.1, вызывающий код должен указать Content-Length или передать
strили объект, подобный байтам, который не является также файлом, в качестве представления тела.В версии 3.2: Теперь body может быть итерируемым объектом.
В версии 3.6: Если в headers не указаны ни Content-Length, ни Transfer-Encoding, объекты body типа файл и итерируемый объект теперь кодируются с помощью фрагментации. Добавлена переменная encode_chunked. Попытки определить Content-Length для объектов файлов не предпринимаются.
-
HTTPConnection.getresponse() -
Должен вызываться после отправки запроса для получения ответа от сервера. Возвращает экземпляр
HTTPResponse.Примечание
Обратите внимание, что вы должны прочитать весь ответ, прежде чем отправлять новый запрос на сервер.
В версии 3.5: Если возникает
ConnectionErrorили подкласс, объектHTTPConnectionбудет готов к повторному подключению при отправке нового запроса.
-
HTTPConnection.set_debuglevel(level) -
Устанавливает уровень отладки. Значение по умолчанию
0, что означает отсутствие вывода отладки. Любое значение, большее0, приведет к выводу всех текущих сообщений отладки в stdout. Значениеdebuglevelпередается всем новым объектамHTTPResponse, которые создаются.В версии 3.1.
-
HTTPConnection.set_tunnel(host, port=None, headers=None) -
Устанавливает хост и порт для HTTP-проксирования соединения. Это позволяет проходить соединение через прокси-сервер.
Аргументы хост и порт указывают конечную точку туннелированного соединения (т. е. адрес, включенный в запрос CONNECT, а не адрес прокси-сервера).
Аргумент headers должен быть отображением дополнительных HTTP-заголовков, которые нужно отправить вместе с запросом CONNECT.
Например, чтобы проксироваться через 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.
-
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больше нуля, сообщения будут выводиться в 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
Объект http.client.HTTPMessage хранит заголовки из HTTP-ответа. Он реализован с помощью класса email.message.Message.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/http.client.html