Содержание страницы
http.client – клиент протокола HTTP¶http.client – HTTP protocol client
Исходный код: 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для context по умолчанию или при передаче cert_file с пользовательским context.Устарело с версии 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 Objects
Экземпляры HTTPConnection имеют следующие методы:
-
HTTPConnection.request(method, url, body=None, headers={}, *, encode_chunked=False)¶ Это отправляет запрос на сервер, используя метод HTTP method и селектор url.
If body is specified, the specified data is sent after the headers are finished. It may be a
str, a bytes-like object, an open file object, or an iterable ofbytes. If body is a string, it is encoded as ISO-8859-1, the default for HTTP. If it is a bytes-like object, the bytes are sent as is. If it is a file object, the contents of the file is sent; this file object should support at least theread()method. If the file object is an instance ofio.TextIOBase, the data returned by theread()method will be encoded as ISO-8859-1, otherwise the data returned byread()is sent as is. If body is an iterable, the elements of the iterable are sent as is until the iterable is exhausted.Аргумент headers должен быть отображением дополнительных HTTP-заголовков, отправляемых с запросом.
Если headers не содержит ни Content-Length, ни Transfer-Encoding, но есть тело запроса, одно из этих полей заголовка будет добавлено автоматически. Если body равно
None, заголовок Content-Length устанавливается в0для методов, которые ожидают тело (PUT,POSTиPATCH). Если body является строкой или байтоподобным объектом, который не является также файлом, заголовок Content-Length устанавливается в его длину. Любой другой тип body (файлы и итерируемые объекты в целом) будет передаваться по частям, и заголовок Transfer-Encoding будет установлен автоматически вместо Content-Length.Аргумент encode_chunked актуален только в том случае, если в headers указан Transfer-Encoding. Если encode_chunked равно
False, объект HTTPConnection предполагает, что всё кодирование выполняется вызывающим кодом. Если равноTrue, тело будет закодировано по частям (chunked).Примечание
Фрагментированное кодирование передачи (chunked transfer encoding) было добавлено в протокол HTTP версии 1.1. Если неизвестно, что HTTP-сервер поддерживает HTTP 1.1, вызывающий код должен либо указать Content-Length, либо передать
strили байтоподобный объект, который не является файлом, в качестве представления тела.Новое в версии 3.2: body теперь может быть итерируемым объектом.
Изменено в версии 3.6: Если в headers не установлены ни Content-Length, ни Transfer-Encoding, файловые и итерируемые объекты body теперь кодируются по частям (chunked). Был добавлен аргумент 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 Tunnelling. Это позволяет пропускать соединение через прокси-сервер.
Аргументы 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()¶ Подключается к серверу, указанному при создании объекта. По умолчанию этот метод вызывается автоматически при выполнении запроса, если у клиента ещё нет соединения.
-
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 будет кодироваться по частям (chunk-encoded), как указано в 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().
Объекты HTTPResponse¶HTTPResponse Objects
Экземпляр 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, если поток закрыт.
Примеры¶Examples
Вот пример сеанса, в котором используется метод 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() # Возвращает всё содержимое.
>>> # Следующий пример демонстрирует чтение данных по частям.
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> while chunk := r1.read(200):
... print(repr(chunk))
b'<!doctype html>\n<!--[if"...
...
>>> # Пример некорректного запроса
>>> 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="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'
>>> conn.close()
Клиентские HTTP PUT-запросы очень похожи на POST-запросы. Разница заключается только на стороне сервера, где HTTP-сервер разрешает создавать ресурсы с помощью PUT-запроса. Следует отметить, что пользовательские HTTP-методы также обрабатываются в urllib.request.Request путём установки соответствующего атрибута method. Ниже приведён пример сеанса, показывающий, как отправить PUT-запрос с помощью http.client:
>>> # Это создаёт HTTP-сообщение.
>>> # с содержимым BODY в качестве вложенного представления
>>> # для ресурса 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¶HTTPMessage Objects
Экземпляр http.client.HTTPMessage содержит заголовки из HTTP
ответа. Он реализован с помощью класса email.message.Message.