http.client
— Клиент протокола HTTP¶
Исходный код: Lib/http/client.py
Этот модуль определяет классы, которые реализуют клиентскую часть протоколов HTTP и HTTPS. Обычно он не используется напрямую - модуль urllib.request
использует его для обработки URL-адресов, использующих HTTP и HTTPS.
См.также
Requests package рекомендуется для клиентского интерфейса HTTP более высокого уровня.
Примечание
Поддержка HTTPS доступна только в том случае, если Python был скомпилирован с поддержкой SSL (через модуль ssl
).
Availability: это не Emscripten, это был не я.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten
и wasm32-wasi
. Дополнительную информацию смотрите в разделе Платформы веб-сборки.
Модуль предоставляет следующие классы:
- class http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None, blocksize=8192)¶
Экземпляр
HTTPConnection
представляет собой одну транзакцию с HTTP-сервером. Его следует создать, передав ему хост и необязательный номер порта. Если номер порта не передан, порт извлекается из строки хоста, если он имеет видhost:port
, в противном случае используется HTTP-порт по умолчанию (80). Если указан необязательный параметр timeout, время ожидания блокирующих операций (например, попыток подключения) истекает через это количество секунд (если оно не указано, используется глобальное значение времени ожидания по умолчанию). Необязательный параметр source_address может представлять собой набор значений (хост, порт), которые используются в качестве исходного адреса для установления HTTP-соединения. Необязательный параметр blocksize задает размер буфера в байтах для отправки текста сообщения в виде файла.Например, при выполнении следующих вызовов все экземпляры create подключаются к серверу на одном и том же хосте и порту:
>>> 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: был добавлен исходный_адрес.
Изменено в версии 3.4: Параметр strict был удален. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.
Изменено в версии 3.7: был добавлен параметр размер блока.
- 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
равно 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
для контекста по умолчанию или когда файл сертификата передается с пользовательским контекстом.Изменено в версии 3.10: Этот класс теперь отправляет расширение ALPN с индикатором протокола
http/1.1
, если не задан контекст. Пользовательский контекст должен указывать протоколы ALPN с помощьюset_alpn_protocols()
.Не рекомендуется, начиная с версии 3.6: key_file и cert_file устарели в пользу context. Пожалуйста, используйте вместо этого
ssl.SSLContext.load_cert_chain()
или позвольтеssl.create_default_context()
выбрать для вас сертификаты доверенного центра сертификации системы.Параметр 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-like object, открытый file object или повторяющийсяbytes
. Если body является строкой, то она кодируется как ISO-8859-1, что используется по умолчанию для HTTP. Если это байтовый объект, то байты передаются как есть. Если это file object, то отправляется содержимое файла; этот файловый объект должен поддерживать, по крайней мере, методread()
. Если файловый объект является экземпляромio.TextIOBase
, данные, возвращаемые методомread()
, будут закодированы как ISO-8859-1, в противном случае данные, возвращаемые методомread()
, отправляются как есть. Если body является итерируемым, элементы итерируемого объекта передаются как есть до тех пор, пока итерируемый объект не будет исчерпан.Аргумент headers должен быть отображением дополнительных HTTP-заголовков для отправки с запросом. Для соответствия требованиям RFC 2616 §5.1.2 необходимо указать Host header (за исключением случаев подключения к HTTP-прокси-серверу или использования методов
OPTIONS
илиCONNECT
).Если headers не содержит ни Content-Length, ни Transfer-Encoding, но есть текст запроса, одно из этих полей заголовка будет добавлено автоматически. Если значение body равно
None
, то для заголовка Content-Length устанавливается значение0
для методов, которые ожидают body (PUT
,POST
, иPATCH
). Если body является строкой или байтоподобным объектом, который также не является file, для заголовка Content-Length устанавливается значение его длины. Любой другой тип body (файлы и повторяемые объекты в целом) будет закодирован в виде фрагментов, и заголовок Transfer-Encoding будет автоматически установлен вместо Content-Length.Аргумент encode_chunked имеет значение только в том случае, если в 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, вызывающий сервер должен либо указать длину содержимого, либо передать
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
, приведет к тому, что все отладочные выходные данные, определенные в данный момент, будут выводиться в стандартный вывод.debuglevel
передается всем новымHTTPResponse
созданным объектам.Добавлено в версии 3.1.
- HTTPConnection.set_tunnel(host, port=None, headers=None)¶
Задайте хост и порт для туннелирования HTTP-соединения. Это позволяет запускать соединение через прокси-сервер.
Аргументы host и port указывают конечную точку туннелируемого соединения (т.е. адрес, указанный в запросе на подключение, а не адрес прокси-сервера).
Аргумент headers должен быть отображением дополнительных HTTP-заголовков для отправки с запросом на подключение.
Например, для туннелирования через прокси-сервер 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()¶
Подключитесь к серверу, указанному при создании объекта. По умолчанию это вызывается автоматически при отправке запроса, если у клиента еще нет подключения.
Создает auditing event
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 реализует buffer interface, то результатом кодирования будет один фрагмент. Если message_body являетсяcollections.abc.Iterable
, то каждая итерация message_body приведет к созданию фрагмента. Если значение message_body равно file object, то каждый вызов.read()
приведет к созданию фрагмента данных. Метод автоматически сигнализирует об окончании данных, закодированных в виде фрагмента, сразу после message_body.Примечание
Из-за спецификации фрагментированного кодирования пустые фрагменты, выдаваемые телом итератора, будут игнорироваться кодировщиком фрагментов. Это делается для того, чтобы избежать преждевременного завершения чтения запроса целевым сервером из-за неправильной кодировки.
Изменено в версии 3.6: Добавлена поддержка фрагментированного кодирования и параметр encode_chunked.
- HTTPConnection.send(data)¶
Отправлять данные на сервер. Это следует использовать непосредственно только после вызова метода
endheaders()
и до вызова методаgetresponse()
.Создает auditing event
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
, если поток закрыт.
Примеры¶
Вот пример сеанса, в котором используется метод 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
путем установки соответствующего атрибута method. Вот пример сеанса, в котором используется метод 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
Объекты HTTP-сообщений¶
- class http.client.HTTPMessage(email.message.Message)¶
Экземпляр http.client.HTTPMessage
содержит заголовки из HTTP-ответа. Он реализован с использованием класса email.message.Message
.