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. Если заголовок 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 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