Содержание страницы
20.7. httplib – клиент протокола HTTP¶httplib – HTTP protocol client
Примечание
Модуль httplib переименован в http.client в Python
3. Инструмент 2to3 автоматически адаптирует импорты при преобразовании
исходных кодов в Python 3.
Исходный код: Lib/httplib.py
Этот модуль определяет классы, реализующие клиентскую сторону протоколов HTTP и HTTPS. Обычно он не используется напрямую – модуль urllib использует его для обработки URL, использующих HTTP и HTTPS.
См. также
Для высокоуровневого интерфейса HTTP-клиента рекомендуется пакет Requests.
Примечание
Поддержка HTTPS доступна только в том случае, если модуль socket был скомпилирован с поддержкой SSL.
Примечание
Публичный интерфейс этого модуля существенно изменился в Python 2.0. Класс HTTP сохранён только для обратной совместимости с версией 1.5.2. Его не следует использовать в новом коде. Обратитесь к онлайн-докстрингам за инструкциями по использованию.
Модуль предоставляет следующие классы:
-
class
httplib.HTTPConnection(host[, port[, strict[, timeout[, source_address]]]])¶ Экземпляр
HTTPConnectionпредставляет одну транзакцию с HTTP-сервером. Его следует создавать, передавая ему хост и опционально номер порта. Если номер порта не передан, порт извлекается из строки хоста, если она имеет формуhost:port; в противном случае используется порт HTTP по умолчанию (80). Если необязательный параметр strict равен true (по умолчанию false), тоBadStatusLineбудет возбуждено, если строка статуса не может быть разобрана как допустимая строка статуса HTTP/1.0 или 1.1. Если задан необязательный параметр timeout, блокирующие операции (например, попытки соединения) будут прерываться по таймауту через указанное количество секунд (если он не задан, используется глобальная настройка таймаута по умолчанию). Необязательный параметр source_address может быть кортежем (host, port), используемым в качестве исходного адреса для HTTP-соединения.Например, следующие вызовы создают экземпляры, подключающиеся к одному и тому же серверу по одному и тому же хосту и порту:
>>> h1 = httplib.HTTPConnection('www.cwi.nl') >>> h2 = httplib.HTTPConnection('www.cwi.nl:80') >>> h3 = httplib.HTTPConnection('www.cwi.nl', 80) >>> h3 = httplib.HTTPConnection('www.cwi.nl', 80, timeout=10)
Новое в версии 2.0.
Изменено в версии 2.6: добавлен параметр timeout.
Изменено в версии 2.7: source_address был добавлен.
-
class
httplib.HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address[, context]]]]]]])¶ Подкласс
HTTPConnection, использующий SSL для связи с защищёнными серверами. Порт по умолчанию –443. Если указан context, он должен быть экземпляромssl.SSLContext, описывающим различные параметры SSL.key_file и cert_file устарели; используйте вместо них
ssl.SSLContext.load_cert_chain()или позвольтеssl.create_default_context()выбрать доверенные сертификаты CA системы.Пожалуйста, прочитайте Рекомендации по безопасности для получения дополнительной информации о лучших практиках.
Новое в версии 2.0.
Изменено в версии 2.6: добавлен параметр timeout.
Изменено в версии 2.7: source_address был добавлен.
Изменено в версии 2.7.9: context был добавлен.
Теперь этот класс по умолчанию выполняет все необходимые проверки сертификатов и имён хостов. Чтобы вернуться к предыдущему, непроверенному поведению,
ssl._create_unverified_context()можно передать в параметр context.
-
class
httplib.HTTPResponse(sock, debuglevel=0, strict=0)¶ Класс, экземпляры которого возвращаются при успешном подключении. Не создаётся напрямую пользователем.
Новое в версии 2.0.
-
class
httplib.HTTPMessage¶ Экземпляр
HTTPMessageиспользуется для хранения заголовков HTTP-ответа. Он реализован с помощью классаmimetools.Messageи предоставляет вспомогательные функции для работы с HTTP-заголовками. Пользователи не создают его экземпляры напрямую.
При необходимости генерируются следующие исключения:
-
exception
httplib.HTTPException¶ Базовый класс остальных исключений в этом модуле. Является подклассом
Exception.Новое в версии 2.0.
-
exception
httplib.NotConnected¶ Подкласс
HTTPException.Новое в версии 2.0.
-
exception
httplib.InvalidURL¶ Подкласс
HTTPException, возбуждается, если указан порт, который не является числом или пуст.Новое в версии 2.3.
-
exception
httplib.UnknownProtocol¶ Подкласс
HTTPException.Новое в версии 2.0.
-
exception
httplib.UnknownTransferEncoding¶ Подкласс
HTTPException.Новое в версии 2.0.
-
exception
httplib.UnimplementedFileMode¶ Подкласс
HTTPException.Новое в версии 2.0.
-
exception
httplib.IncompleteRead¶ Подкласс
HTTPException.Новое в версии 2.0.
-
exception
httplib.ImproperConnectionState¶ Подкласс
HTTPException.Новое в версии 2.0.
-
exception
httplib.CannotSendRequest¶ Подкласс
ImproperConnectionState.Новое в версии 2.0.
-
exception
httplib.CannotSendHeader¶ Подкласс
ImproperConnectionState.Новое в версии 2.0.
-
exception
httplib.ResponseNotReady¶ Подкласс
ImproperConnectionState.Новое в версии 2.0.
-
exception
httplib.BadStatusLine¶ Подкласс
HTTPException. Возбуждается, если сервер отвечает HTTP-кодом состояния, который не распознаётся.Новое в версии 2.0.
Константы, определённые в этом модуле:
-
httplib.HTTP_PORT¶ Порт по умолчанию для протокола HTTP (всегда
80).
-
httplib.HTTPS_PORT¶ Порт по умолчанию для протокола HTTPS (всегда
443).
а также следующие константы для целочисленных кодов состояния:
Константа |
Значение |
Определение |
|---|---|---|
|
|
HTTP/1.1, RFC 2616, раздел 10.1.1 |
|
|
HTTP/1.1, RFC 2616, раздел 10.1.2 |
|
|
WEBDAV, RFC 2518, раздел 10.1 |
|
|
HTTP/1.1, RFC 2616, раздел 10.2.1 |
|
|
HTTP/1.1, RFC 2616, раздел 10.2.2 |
|
|
HTTP/1.1, RFC 2616, раздел 10.2.3 |
|
|
HTTP/1.1, RFC 2616, раздел 10.2.4 |
|
|
HTTP/1.1, RFC 2616, раздел 10.2.5 |
|
|
HTTP/1.1, RFC 2616, раздел 10.2.6 |
|
|
HTTP/1.1, RFC 2616, раздел 10.2.7 |
|
|
WEBDAV RFC 2518, раздел 10.2 |
|
|
Дельта-кодирование в HTTP, RFC 3229, раздел 10.4.1 |
|
|
HTTP/1.1, RFC 2616, раздел 10.3.1 |
|
|
HTTP/1.1, RFC 2616, раздел 10.3.2 |
|
|
HTTP/1.1, RFC 2616, раздел 10.3.3 |
|
|
HTTP/1.1, RFC 2616, раздел 10.3.4 |
|
|
HTTP/1.1, RFC 2616, раздел 10.3.5 |
|
|
HTTP/1.1, RFC 2616, раздел 10.3.6 |
|
|
HTTP/1.1, RFC 2616, раздел 10.3.8 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.1 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.2 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.3 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.4 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.5 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.6 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.7 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.8 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.9 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.10 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.11 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.12 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.13 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.14 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.15 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.16 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.17 |
|
|
HTTP/1.1, RFC 2616, раздел 10.4.18 |
|
|
WEBDAV, RFC 2518, раздел 10.3 |
|
|
WEBDAV RFC 2518, раздел 10.4 |
|
|
WEBDAV, RFC 2518, раздел 10.5 |
|
|
Обновление HTTP до TLS, RFC 2817, раздел 6 |
|
|
HTTP/1.1, RFC 2616, раздел 10.5.1 |
|
|
HTTP/1.1, RFC 2616, раздел 10.5.2 |
|
|
HTTP/1.1 RFC 2616, раздел 10.5.3 |
|
|
HTTP/1.1, RFC 2616, раздел 10.5.4 |
|
|
HTTP/1.1 RFC 2616, раздел 10.5.5 |
|
|
HTTP/1.1, RFC 2616, раздел 10.5.6 |
|
|
WEBDAV, RFC 2518, раздел 10.6 |
|
|
Расширение HTTP Framework, RFC 2774, раздел 7 |
-
httplib.responses¶ Этот словарь сопоставляет коды состояния HTTP 1.1 с названиями W3C.
Пример:
httplib.responses[httplib.NOT_FOUND]– это'Not Found'.Новое в версии 2.5.
20.7.1. Объекты HTTPConnection¶HTTPConnection Objects
Экземпляры HTTPConnection имеют следующие методы:
-
HTTPConnection.request(method, url[, body[, headers]])¶ Этот метод отправляет запрос на сервер, используя HTTP-метод method и селектор url. Если аргумент body присутствует, он должен быть строкой с данными, которые будут отправлены после заголовков. Альтернативно, это может быть открытый файловый объект; в этом случае отправляется содержимое файла. Этот файловый объект должен поддерживать методы
fileno()иread(). Аргумент headers должен быть отображением (mapping) дополнительных HTTP-заголовков для отправки вместе с запросом.Если заголовок не указан в headers, заголовок
Content-Lengthдобавляется автоматически для всех методов, если длина тела может быть определена – либо из длины представленияstr, либо из указанного размера файла на диске. Если body равенNone, заголовок не устанавливается, за исключением методов, которые ожидают тело (PUT,POSTиPATCH); в этом случае он устанавливается в0.Изменено в версии 2.6: body может быть файловым объектом.
-
HTTPConnection.getresponse()¶ Должен вызываться после отправки запроса для получения ответа от сервера. Возвращает экземпляр
HTTPResponse.Примечание
Обратите внимание: необходимо прочитать весь ответ, прежде чем отправлять новый запрос на сервер.
-
HTTPConnection.set_debuglevel(level)¶ Устанавливает уровень отладки (количество выводимой отладочной информации). Уровень отладки по умолчанию –
0, то есть отладочная информация не выводится.
-
HTTPConnection.set_tunnel(host, port=None, headers=None)¶ Устанавливает хост и порт для HTTP Connect Tunnelling. Обычно используется, когда требуется выполнить HTTPS-соединение через прокси-сервер.
Аргумент headers должен быть отображением дополнительных HTTP-заголовков, отправляемых с запросом CONNECT.
Новое в версии 2.7.
-
HTTPConnection.connect()¶ Подключается к серверу, указанному при создании объекта.
-
HTTPConnection.close()¶ Закрывает соединение с сервером.
В качестве альтернативы использованию описанного выше метода request() вы также можете отправлять запрос пошагово, используя четыре функции, приведённые ниже.
-
HTTPConnection.putrequest(request, selector[, skip_host[, skip_accept_encoding]])¶ Это должен быть первый вызов после установления соединения с сервером. Он отправляет на сервер строку, состоящую из строки request, строки selector и версии HTTP (
HTTP/1.1). Чтобы отключить автоматическую отправку заголовковHost:илиAccept-Encoding:(например, для принятия дополнительных кодировок содержимого), укажите skip_host или skip_accept_encoding с отличными от False значениями.Изменено в версии 2.4: skip_accept_encoding аргумент добавлен.
-
HTTPConnection.putheader(header, argument[, ...])¶ Отправляет заголовок в стиле RFC 822 на сервер. Он отправляет строку, состоящую из заголовка, двоеточия, пробела и первого аргумента. Если заданы дополнительные аргументы, отправляются строки продолжения, каждая из которых состоит из табуляции и аргумента.
-
HTTPConnection.endheaders(message_body=None)¶ Отправляет пустую строку серверу, сигнализируя об окончании заголовков. Необязательный аргумент message_body можно использовать для передачи тела сообщения, связанного с запросом. Тело сообщения будет отправлено в том же пакете, что и заголовки, если оно является строкой; в противном случае оно отправляется в отдельном пакете.
Изменено в версии 2.7: message_body был добавлен.
-
HTTPConnection.send(data)¶ Отправляет данные на сервер. Это следует использовать напрямую только после вызова метода
endheaders()и до вызоваgetresponse().
20.7.2. Объекты HTTPResponse¶HTTPResponse Objects
Экземпляры HTTPResponse имеют следующие методы и атрибуты:
-
HTTPResponse.read([amt])¶ Читает и возвращает тело ответа, или до следующих amt байт.
-
HTTPResponse.getheader(name[, default])¶ Возвращает содержимое заголовка name или default, если соответствующий заголовок отсутствует.
-
HTTPResponse.getheaders()¶ Возвращает список кортежей (заголовок, значение).
Новое в версии 2.4.
-
HTTPResponse.fileno()¶ Возвращает
filenoбазового сокета.
-
HTTPResponse.msg¶ Экземпляр
mimetools.Message, содержащий заголовки ответа.
-
HTTPResponse.version¶ Версия протокола HTTP, используемая сервером. 10 для HTTP/1.0, 11 для HTTP/1.1.
-
HTTPResponse.status¶ Код состояния, возвращаемый сервером.
-
HTTPResponse.reason¶ Фраза причины, возвращаемая сервером.
20.7.3. Примеры¶Examples
Вот пример сеанса, в котором используется метод GET:
>>> import httplib
>>> conn = httplib.HTTPSConnection("www.python.org")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
>>> data1 = r1.read()
>>> conn.request("GET", "/")
>>> r2 = conn.getresponse()
>>> print r2.status, r2.reason
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
Вот пример сеанса, в котором используется метод HEAD. Обратите внимание, что
метод HEAD никогда не возвращает данные.
>>> import httplib
>>> conn = httplib.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 == ''
True
Ниже приведён пример сеанса, показывающий, как отправлять POST запросы:
>>> import httplib, urllib
>>> params = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
... "Accept": "text/plain"}
>>> conn = httplib.HTTPConnection("bugs.python.org")
>>> conn.request("POST", "", params, headers)
>>> response = conn.getresponse()
>>> print response.status, response.reason
302 Found
>>> data = response.read()
>>> data
'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'
>>> conn.close()
Клиентские запросы HTTP PUT очень похожи на запросы POST. Разница
состоит только на стороне сервера: HTTP-сервер позволяет создавать
ресурсы с помощью запроса PUT. Ниже приведён пример сеанса работы,
показывающий, как выполнить запрос PUT с помощью httplib:
>>> # Это создаёт HTTP-сообщение.
>>> # с содержимым BODY в качестве вложенного представления
>>> # для ресурса http://localhost:8080/foobar
...
>>> import httplib
>>> BODY = "***filecontents***"
>>> conn = httplib.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print response.status, response.reason
200, OK