Содержание страницы
20.10. http.client – клиент протокола HTTP¶http.client – HTTP protocol client
Этот модуль определяет классы, реализующие клиентскую сторону протоколов HTTP и HTTPS. Обычно он не используется напрямую – модуль urllib.request применяет его для обработки URL, использующих HTTP и HTTPS.
Примечание
Поддержка HTTPS доступна только в том случае, если модуль socket был скомпилирован с поддержкой SSL.
Модуль предоставляет следующие классы:
- class http.client.HTTPConnection(host, port=None, strict=None[, timeout])¶
Экземпляр HTTPConnection представляет одну транзакцию с HTTP-сервером. Его следует создавать, передавая хост и необязательный номер порта. Если номер порта не передан, порт извлекается из строки хоста, если она имеет вид host:port; в противном случае используется порт HTTP по умолчанию (80). Если True, необязательный параметр strict (по умолчанию ложное значение) вызывает BadStatusLine, если строка состояния не может быть разобрана как допустимая строка состояния HTTP/1.0 или 1.1. Если задан необязательный параметр timeout, блокирующие операции (например, попытки соединения) будут прерваны по истечении этого количества секунд (если он не задан, используется глобальная настройка таймаута по умолчанию).
Например, следующие вызовы создают экземпляры, подключающиеся к одному и тому же серверу по одному и тому же хосту и порту:
>>> 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)
- class http.client.HTTPSConnection(host, port=None, key_file=None, cert_file=None, strict=None[, timeout])¶
Подкласс HTTPConnection, который использует SSL для связи с безопасными серверами. Порт по умолчанию – 443. key_file – это имя файла в формате PEM, содержащего ваш закрытый ключ, а cert_file – это файл цепочки сертификатов в формате PEM; оба могут использоваться для аутентификации на сервере.
Предупреждение
Это не выполняет никакой проверки сертификата сервера.
- class http.client.HTTPResponse(sock, debuglevel=0, strict=0, method=None, url=None)¶
- Класс, экземпляры которого возвращаются при успешном соединении. Не создаётся напрямую пользователем.
При необходимости генерируются следующие исключения:
- 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¶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.
Аргумент headers должен быть отображением дополнительных HTTP-заголовков, отправляемых вместе с запросом.
- HTTPConnection.getresponse()¶
Должен вызываться после отправки запроса для получения ответа от сервера. Возвращает экземпляр HTTPResponse.
Примечание
Обратите внимание: необходимо прочитать весь ответ, прежде чем отправлять новый запрос на сервер.
- HTTPConnection.set_debuglevel(level)¶
Устанавливает уровень отладки. Уровень отладки по умолчанию равен 0, то есть отладочный вывод не производится. Любое значение больше 0 приведёт к выводу всех текущих определённых отладочных сообщений в stdout. debuglevel передаётся всем новым создаваемым объектам HTTPResponse.
Новое в версии 3.1.
- 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()¶
- Отправляет пустую строку на сервер, сигнализируя об окончании заголовков.
- 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. Объекты HTTPResponse¶HTTPResponse 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 по мере чтения и разбора ответа.
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", "/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({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
... "Accept": "text/plain"}
>>> conn = http.client.HTTPConnection("musi-cal.mojam.com:80")
>>> conn.request("POST", "/cgi-bin/query", params, headers)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200 OK
>>> data = response.read()
>>> conn.close()
20.10.4. Объекты HTTPMessage¶HTTPMessage Objects
Экземпляр http.client.HTTPMessage содержит заголовки HTTP-ответа. Он реализован с помощью класса email.message.Message.