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

20.7. httplib – клиент протокола HTTPhttplib – 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).

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

Константа

Значение

Определение

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

httplib.responses

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

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

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

20.7.1. Объекты HTTPConnectionHTTPConnection 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. Объекты HTTPResponseHTTPResponse 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