Содержание страницы
21.12. 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)¶
Экземпляр HTTPConnection представляет одну транзакцию с HTTP-сервером. При создании ему передаются имя хоста и необязательный номер порта. Если номер порта не указан, порт извлекается из строки хоста, если она имеет вид host:port; в противном случае используется порт HTTP по умолчанию (80). Если задан необязательный параметр timeout, блокирующие операции (например, попытки подключения) будут завершаться по тайм-ауту через указанное количество секунд (если параметр не задан, используется глобальная настройка тайм-аута по умолчанию). Необязательный параметр source_address может быть кортежем (host, port), который будет использоваться в качестве исходного адреса для HTTP-соединения.
Например, следующие вызовы создают экземпляры, подключающиеся к одному и тому же серверу по одному и тому же хосту и порту:
>>> 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 («простые ответы») больше не поддерживаются.
- class http.client.HTTPSConnection(host, port=None, key_file=None, cert_file=None, [timeout, ]source_address=None, *, context=None, check_hostname=None)¶
Подкласс HTTPConnection, использующий SSL для связи с защищёнными серверами. Порт по умолчанию: 443. Если указан context, он должен быть экземпляром ssl.SSLContext, описывающим различные параметры SSL.
key_file и cert_file устарели; вместо них используйте ssl.SSLContext.load_cert_chain() или позвольте ssl.create_default_context() выбрать доверенные сертификаты ЦС системы. Параметр check_hostname также устарел; вместо него следует использовать атрибут ssl.SSLContext.check_hostname объекта context.
Пожалуйста, прочитайте Рекомендации по безопасности для получения дополнительной информации о лучших практиках.
Изменено в версии 3.2: Добавлены source_address, context и check_hostname.
Изменено в версии 3.2: Теперь этот класс поддерживает виртуальные хосты HTTPS, если это возможно (то есть, если ssl.HAS_SNI истинно).
Изменено в версии 3.4: Параметр strict удалён. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.
Изменено в версии 3.4.3: Теперь этот класс по умолчанию выполняет все необходимые проверки сертификата и имени хоста. Чтобы вернуться к предыдущему непроверенному поведению, параметру context можно передать ssl._create_unverified_context().
- class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)¶
Класс, экземпляры которого возвращаются при успешном соединении. Не создаётся напрямую пользователем.
Изменено в версии 3.4: Параметр strict удалён. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.
При необходимости генерируются следующие исключения:
- 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 получена строка чрезмерной длины.
Константы, определённые в этом модуле:
- 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 |
| PRECONDITION_REQUIRED | 428 | Дополнительные коды состояния HTTP, RFC 6585, раздел 3 |
| TOO_MANY_REQUESTS | 429 | Дополнительные коды статуса HTTP, RFC 6585, раздел 4 |
| REQUEST_HEADER_FIELDS_TOO_LARGE | 431 | Дополнительные коды статуса HTTP, RFC 6585, раздел 5 |
| 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 |
| NETWORK_AUTHENTICATION_REQUIRED | 511 | Дополнительные коды статуса HTTP, RFC 6585, раздел 6 |
Изменено в версии 3.3: Добавлены коды 428, 429, 431 и 511 из RFC 6585.
- http.client.responses¶
Этот словарь сопоставляет коды состояния HTTP 1.1 с названиями W3C.
Пример: http.client.responses[http.client.NOT_FOUND] – это 'Not Found'.
21.12.1. Объекты HTTPConnection¶HTTPConnection Objects
Экземпляры HTTPConnection имеют следующие методы:
- HTTPConnection.request(method, url, body=None, headers={})¶
Это отправляет запрос на сервер, используя метод HTTP method и селектор url.
Если указан body, указанные данные отправляются после завершения заголовков. Он может быть строкой, байтоподобным объектом, открытым файловым объектом или итерируемым объектом из байтоподобных объектов. Если body – строка, она кодируется как ISO-8851-1, кодировка по умолчанию для HTTP. Если это байтоподобный объект, байты отправляются как есть. Если это файловый объект, отправляется содержимое файла; этот файловый объект должен поддерживать как минимум метод read(). Если у файлового объекта есть атрибут mode, данные, возвращаемые методом read(), будут закодированы как ISO-8851-1, если только атрибут mode не содержит подстроку b; в противном случае данные, возвращаемые read(), отправляются как есть. Если body – итерируемый объект, элементы итерируемого объекта отправляются как есть до его исчерпания.
Аргумент headers должен быть отображением дополнительных HTTP-заголовков, отправляемых вместе с запросом.
Если headers не содержит элемент Content-Length, он добавляется автоматически, если это возможно. Если body равен None, заголовок Content-Length устанавливается в 0 для методов, которые ожидают тело (PUT, POST и PATCH). Если body – строка или байтовый объект, заголовок Content-Length устанавливается равным его длине. Если body является файловым объектом и удаётся вызвать fstat() для результата его метода fileno(), то заголовок Content-Length устанавливается равным st_size, возвращаемому вызовом fstat. В противном случае заголовок Content-Length не добавляется.
Новое в версии 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 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()¶
Закрывает соединение с сервером.
В качестве альтернативы описанному выше методу 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.
21.12.2. Объекты HTTPResponse¶HTTPResponse Objects
Экземпляр HTTPResponse инкапсулирует HTTP-ответ от сервера. Он предоставляет доступ к заголовкам запроса и телу сущности. Ответ является итерируемым объектом и может использоваться в операторе with.
- 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.status¶
Код состояния, возвращаемый сервером.
- HTTPResponse.reason¶
Фраза причины, возвращаемая сервером.
- HTTPResponse.debuglevel¶
Отладочный хук. Если debuglevel больше нуля, сообщения будут выводиться в stdout по мере чтения и разбора ответа.
- HTTPResponse.closed¶
Равно True, если поток закрыт.
21.12.3. Примеры¶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 not r1.closed:
... print(r1.read(200)) # 200 байт
b'<!doctype html>\n<!--[if"...
...
>>> # Пример некорректного запроса
>>> 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
21.12.4. Объекты HTTPMessage¶HTTPMessage Objects
Экземпляр http.client.HTTPMessage содержит заголовки HTTP-ответа. Он реализован с помощью класса email.message.Message.