Spec-Zone.ru › Python 3.13

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 истина).

Изменено в версии 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_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, открытый объект файла или итерируемый объект bytes. Если body — строка, она кодируется в формате ISO-8859-1, по умолчанию для HTTP. Если это объект типа bytes, байты отправляются как есть. Если это объект файла, содержимое файла отправляется; этот объект файла должен поддерживать метод 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 — строка или объект типа bytes, который также не является файлом, заголовок Content-Length устанавливается в его длину. Любой другой тип body (файлы и итерируемые объекты в целом) будут передаваться с чанкингом, и вместо Content-Length автоматически будет установлен заголовок Transfer-Encoding.

Аргумент encode_chunked важен только если Transfer-Encoding указан в headers. Если 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

Примечание

Чанкинг был добавлен в протокол HTTP версии 1.1. Если известно, что HTTP-сервер обрабатывает HTTP 1.1, вызывающий код должен либо указать Content-Length, либо передать str или объект типа bytes, который не является файлом, как представление тела.

Изменено в версии 3.2: body теперь может быть итерируемым объектом.

Изменено в версии 3.6: Если ни Content-Length, ни Transfer-Encoding не заданы в headers, файлы и итерируемые 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-туннелирования. Это позволяет использовать соединение через прокси-сервер.

Аргументы host и port задают конечную точку туннелированного соединения (т.е. адрес, включённый в запрос CONNECT, а не адрес прокси-сервера).

Аргумент headers должен быть отображением дополнительных HTTP-заголовков для отправки с запросом CONNECT.

Поскольку для запроса HTTP CONNECT tunnelling используется HTTP/1.1, согласно RFC, должен быть предоставлен заголовок HTTP Host:, соответствующий форме authority целевого запроса, предоставленного в качестве пункта назначения для запроса CONNECT. Если заголовок HTTP Host: не задан с помощью аргумента 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 больше нуля, сообщения будут выводиться в 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 на стороне клиента очень похожи на запросы 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.13/library/http.client.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API