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, 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 передан с пользовательским context.Изменено в версии 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 и 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 имеет значение только если в headers указан Transfer-Encoding. Если 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, либо передать строку или объект-подобный байтам, который также не является файлом, в качестве тела запроса.
Новое в версии 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, приведет к выводу всего текущего отладочного вывода в stdout. Значениеdebuglevelпередается всем новым объектамHTTPResponse, которые создаются.Новое в версии 3.1.
-
HTTPConnection.set_tunnel(host, port=None, headers=None) -
Установите хост и порт для туннелирования HTTP Connect. Это позволяет пропустить соединение через прокси-сервер.
Аргументы host и port определяют конечную точку туннельного соединения (т. е. адрес, включенный в запрос 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 с не-False значениями.
-
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-запросы клиентской стороны очень похожи на запросы 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.11/library/http.client.html