Документация Python неофициальный перевод
Содержание страницы

20.10. http.client – клиент протокола HTTPhttp.client – HTTP protocol client

Исходный код: Lib/http/client.py


Этот модуль определяет классы, реализующие клиентскую сторону протоколов HTTP и HTTPS. Обычно он не используется напрямую – модуль urllib.request применяет его для обработки URL, использующих HTTP и HTTPS.

Примечание

Поддержка HTTPS доступна только в том случае, если Python был собран с поддержкой SSL (через модуль ssl).

Модуль предоставляет следующие классы:

class http.client.HTTPConnection(host, port=None[, strict][, timeout], source_address=None)

Экземпляр HTTPConnection представляет одну транзакцию с HTTP-сервером. При создании ему передаются имя хоста и необязательный номер порта. Если номер порта не указан, порт извлекается из строки хоста, если она имеет вид host:port; в противном случае используется порт HTTP по умолчанию (80). Если задан необязательный параметр timeout, блокирующие операции (например, попытки подключения) будут завершаться по тайм-ауту через указанное количество секунд (если параметр не задан, используется глобальная настройка тайм-аута по умолчанию). Необязательный параметр source_address может быть кортежем (host, port), который будет использоваться в качестве исходного адреса для HTTP-соединения.

Например, следующие вызовы создают экземпляры, подключающиеся к одному и тому же серверу по одному и тому же хосту и порту:

>>> h1 = http.client.HTTPConnection('www.cwi.nl')
>>> h2 = http.client.HTTPConnection('www.cwi.nl:80')
>>> h3 = http.client.HTTPConnection('www.cwi.nl', 80)
>>> h3 = http.client.HTTPConnection('www.cwi.nl', 80, timeout=10)

Изменено в версии 3.2: Был добавлен параметр source_address.

Устарело с версии 3.2: Параметр strict устарел. Ответы в стиле HTTP 0.9 («Simple Responses») больше не поддерживаются.

class http.client.HTTPSConnection(host, port=None, key_file=None, cert_file=None[, strict][, timeout], source_address=None, *, context=None, check_hostname=None)

A subclass of HTTPConnection that uses SSL for communication with secure servers. Default port is 443. If context is specified, it must be a ssl.SSLContext instance describing the various SSL options. If context is specified and has a verify_mode of either CERT_OPTIONAL or CERT_REQUIRED, then by default host is matched against the host name(s) allowed by the server’s certificate. If you want to change that behaviour, you can explicitly set check_hostname to False.

key_file и cert_file устарели, используйте вместо них ssl.SSLContext.load_cert_chain().

При доступе к произвольным хостам в Интернете рекомендуется требовать проверку сертификата и передать в context набор доверенных сертификатов УЦ:

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations('/etc/pki/tls/certs/ca-bundle.crt')
h = client.HTTPSConnection('svn.python.org', 443, context=context)

Изменено в версии 3.2: Были добавлены параметры source_address, context и check_hostname.

Изменено в версии 3.2: Этот класс теперь поддерживает виртуальные хосты HTTPS, если это возможно (то есть, если ssl.HAS_SNI истинно).

Устарело с версии 3.2: Параметр strict устарел. Ответы в стиле HTTP 0.9 («Simple Responses») больше не поддерживаются.

class http.client.HTTPResponse(sock, debuglevel=0[, strict], method=None, url=None)

Класс, экземпляры которого возвращаются при успешном соединении. Не создаётся напрямую пользователем.

Устарело с версии 3.2: Параметр strict устарел. Ответы в стиле HTTP 0.9 («Simple Responses») больше не поддерживаются.

При необходимости генерируются следующие исключения:

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, который не удаётся распознать.

Константы, определённые в этом модуле:

http.client.HTTP_PORT

Порт по умолчанию для протокола HTTP (всегда 80).

http.client.HTTPS_PORT

Порт по умолчанию для протокола HTTPS (всегда 443).

а также следующие константы для целочисленных кодов состояния:

Константа Значение Определение
CONTINUE 100 HTTP/1.1, RFC 2616, раздел 10.1.1
SWITCHING_PROTOCOLS 101 HTTP/1.1, RFC 2616, раздел 10.1.2
PROCESSING 102 WEBDAV, RFC 2518, раздел 10.1
OK 200 HTTP/1.1, RFC 2616, раздел 10.2.1
CREATED 201 HTTP/1.1, RFC 2616, раздел 10.2.2
ACCEPTED 202 HTTP/1.1, RFC 2616, раздел 10.2.3
NON_AUTHORITATIVE_INFORMATION 203 HTTP/1.1, RFC 2616, раздел 10.2.4
NO_CONTENT 204 HTTP/1.1, RFC 2616, раздел 10.2.5
RESET_CONTENT 205 HTTP/1.1, RFC 2616, раздел 10.2.6
PARTIAL_CONTENT 206 HTTP/1.1, RFC 2616, раздел 10.2.7
MULTI_STATUS 207 WEBDAV RFC 2518, раздел 10.2
IM_USED 226 Дельта-кодирование в HTTP, RFC 3229, раздел 10.4.1
MULTIPLE_CHOICES 300 HTTP/1.1, RFC 2616, раздел 10.3.1
MOVED_PERMANENTLY 301 HTTP/1.1, RFC 2616, раздел 10.3.2
FOUND 302 HTTP/1.1, RFC 2616, раздел 10.3.3
SEE_OTHER 303 HTTP/1.1, RFC 2616, раздел 10.3.4
NOT_MODIFIED 304 HTTP/1.1, RFC 2616, раздел 10.3.5
USE_PROXY 305 HTTP/1.1, RFC 2616, раздел 10.3.6
TEMPORARY_REDIRECT 307 HTTP/1.1, RFC 2616, раздел 10.3.8
BAD_REQUEST 400 HTTP/1.1, RFC 2616, раздел 10.4.1
UNAUTHORIZED 401 HTTP/1.1, RFC 2616, раздел 10.4.2
PAYMENT_REQUIRED 402 HTTP/1.1, RFC 2616, раздел 10.4.3
FORBIDDEN 403 HTTP/1.1, RFC 2616, раздел 10.4.4
NOT_FOUND 404 HTTP/1.1, RFC 2616, раздел 10.4.5
METHOD_NOT_ALLOWED 405 HTTP/1.1, RFC 2616, раздел 10.4.6
NOT_ACCEPTABLE 406 HTTP/1.1, RFC 2616, раздел 10.4.7
PROXY_AUTHENTICATION_REQUIRED 407 HTTP/1.1, RFC 2616, раздел 10.4.8
REQUEST_TIMEOUT 408 HTTP/1.1, RFC 2616, раздел 10.4.9
CONFLICT 409 HTTP/1.1, RFC 2616, раздел 10.4.10
GONE 410 HTTP/1.1, RFC 2616, раздел 10.4.11
LENGTH_REQUIRED 411 HTTP/1.1, RFC 2616, раздел 10.4.12
PRECONDITION_FAILED 412 HTTP/1.1, RFC 2616, раздел 10.4.13
REQUEST_ENTITY_TOO_LARGE 413 HTTP/1.1, RFC 2616, раздел 10.4.14
REQUEST_URI_TOO_LONG 414 HTTP/1.1, RFC 2616, раздел 10.4.15
UNSUPPORTED_MEDIA_TYPE 415 HTTP/1.1, RFC 2616, раздел 10.4.16
REQUESTED_RANGE_NOT_SATISFIABLE 416 HTTP/1.1, RFC 2616, раздел 10.4.17
EXPECTATION_FAILED 417 HTTP/1.1, RFC 2616, раздел 10.4.18
UNPROCESSABLE_ENTITY 422 WEBDAV, RFC 2518, раздел 10.3
LOCKED 423 WEBDAV RFC 2518, раздел 10.4
FAILED_DEPENDENCY 424 WEBDAV, RFC 2518, раздел 10.5
UPGRADE_REQUIRED 426 Обновление HTTP до TLS, RFC 2817, раздел 6
INTERNAL_SERVER_ERROR 500 HTTP/1.1, RFC 2616, раздел 10.5.1
NOT_IMPLEMENTED 501 HTTP/1.1, RFC 2616, раздел 10.5.2
BAD_GATEWAY 502 HTTP/1.1 RFC 2616, раздел 10.5.3
SERVICE_UNAVAILABLE 503 HTTP/1.1, RFC 2616, раздел 10.5.4
GATEWAY_TIMEOUT 504 HTTP/1.1 RFC 2616, раздел 10.5.5
HTTP_VERSION_NOT_SUPPORTED 505 HTTP/1.1, RFC 2616, раздел 10.5.6
INSUFFICIENT_STORAGE 507 WEBDAV, RFC 2518, раздел 10.6
NOT_EXTENDED 510 Расширение HTTP Framework, RFC 2774, раздел 7
http.client.responses

Этот словарь сопоставляет коды состояния HTTP 1.1 с названиями W3C.

Пример: http.client.responses[http.client.NOT_FOUND] – это 'Not Found'.

20.10.1. HTTPConnection Objects

Экземпляры HTTPConnection имеют следующие методы:

HTTPConnection.request(method, url, body=None, headers={})

Это отправляет запрос на сервер, используя метод HTTP-запроса method и селектор url. Если аргумент body присутствует, он должен быть строкой или объектом bytes с данными для отправки после завершения заголовков. Строки кодируются как ISO-8859-1, кодировка по умолчанию для HTTP. Для использования других кодировок передавайте объект bytes. Заголовок Content-Length устанавливается равным длине строки.

Аргумент body также может быть открытым файловым объектом, и в этом случае отправляется содержимое файла; этот файловый объект должен поддерживать методы fileno() и read(). Заголовок Content-Length автоматически устанавливается равным длине файла, полученной через stat. Аргумент body также может быть итерируемым объектом, и в этом случае заголовок Content-Length должен быть указан явно.

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

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

HTTPConnection.getresponse()

Должен вызываться после отправки запроса для получения ответа от сервера. Возвращает экземпляр HTTPResponse.

Примечание

Обратите внимание: необходимо прочитать весь ответ, прежде чем отправлять новый запрос на сервер.

HTTPConnection.set_debuglevel(level)

Устанавливает уровень отладки. Уровень отладки по умолчанию равен 0, то есть отладочный вывод не производится. Любое значение больше 0 приведёт к выводу всех текущих определённых отладочных сообщений в stdout. debuglevel передаётся всем новым создаваемым объектам HTTPResponse.

Новое в версии 3.1.

HTTPConnection.set_tunnel(host, port=None, headers=None)

Устанавливает хост и порт для HTTP-туннелирования через CONNECT. Обычно используется, когда требуется подключение HTTPS через прокси-сервер.

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

Новое в версии 3.2.

HTTPConnection.connect()

Подключается к серверу, указанному при создании объекта.

HTTPConnection.close()

Закрывает соединение с сервером.

В качестве альтернативы описанному выше методу request() можно отправлять запрос пошагово, используя четыре функции ниже.

HTTPConnection.putrequest(request, selector, skip_host=False, skip_accept_encoding=False)

Это должен быть первый вызов после установки соединения с сервером. Он отправляет серверу строку, состоящую из строки request, строки selector и версии HTTP (HTTP/1.1). Чтобы отключить автоматическую отправку заголовков Host: или Accept-Encoding: (например, для поддержки дополнительных кодировок содержимого), укажите skip_host или skip_accept_encoding со значениями, отличными от False.

HTTPConnection.putheader(header, argument[, ...])

Отправляет заголовок в стиле RFC 822 на сервер. Он отправляет строку, состоящую из заголовка, двоеточия, пробела и первого аргумента. Если заданы дополнительные аргументы, отправляются строки продолжения, каждая из которых состоит из табуляции и аргумента.

HTTPConnection.endheaders(message_body=None)

Отправляет пустую строку серверу, сигнализируя об окончании заголовков. Необязательный аргумент message_body можно использовать для передачи тела сообщения, связанного с запросом. Тело сообщения будет отправлено в том же пакете, что и заголовки, если оно является строкой; в противном случае оно отправляется в отдельном пакете.

HTTPConnection.send(data)

Send data to the server. This should be used directly only after the endheaders() method has been called and before getresponse() is called.

20.10.2. Объекты HTTPResponseHTTPResponse Objects

Экземпляр HTTPResponse инкапсулирует HTTP-ответ от сервера. Он предоставляет доступ к заголовкам запроса и телу сущности. Ответ является итерируемым объектом и может использоваться в операторе with.

HTTPResponse.read([amt])

Читает и возвращает тело ответа, или до следующих amt байт.

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.status

Код состояния, возвращаемый сервером.

HTTPResponse.reason

Фраза причины, возвращаемая сервером.

HTTPResponse.debuglevel

Отладочный хук. Если debuglevel больше нуля, сообщения будут выводиться в stdout по мере чтения и разбора ответа.

HTTPResponse.closed

Имеет значение True, если поток закрыт.

20.10.3. ПримерыExamples

Ниже приведён пример сеанса, использующего метод GET:

>>> import http.client
>>> conn = http.client.HTTPConnection("www.python.org")
>>> conn.request("GET", "/index.html")
>>> r1 = conn.getresponse()
>>> print(r1.status, r1.reason)
200 OK
>>> data1 = r1.read()  # Возвращает всё содержимое.
>>> # Следующий пример демонстрирует чтение данных по частям.
>>> conn.request("GET", "/index.html")
>>> r1 = conn.getresponse()
>>> while not r1.closed:
...     print(r1.read(200)) # 200 байт
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
...
>>> # Пример некорректного запроса
>>> 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.HTTPConnection("www.python.org")
>>> conn.request("HEAD","/index.html")
>>> 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. Вот пример сеанса, показывающий, как выполнить запрос PUT с помощью http.client:

>>> # Это создаёт HTTP-сообщение.
>>> # с содержимым BODY в качестве вложенного представления
>>> # для ресурса http://localhost:8080/foobar
...
>>> import http.client
>>> BODY = "***filecontents***"
>>> conn = http.client.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print(resp.status, response.reason)
200, OK

20.10.4. Объекты HTTPMessageHTTPMessage Objects

Экземпляр http.client.HTTPMessage содержит заголовки HTTP-ответа. Он реализован с помощью класса email.message.Message.