>Transfer-Encoding: chunked
Так выглядят заголовки ответов HTTP и их значения. Некоторые из них, вроде Date или Content-Type, обязательны. Другие, наподобие Set-Cookie, используются для отслеживания вашей активности в течение нескольких посещений (мы поговорим об управлении состоянием немного позже). Когда вы делаете запрос HTTP HEAD, то получаете в ответ только заголовки. Если вы использовали команды HTTP GET или HTTP POST, также получите данные от домашней страницы (смесь HTML, CSS, JavaScript и всего прочего, что Google решит разместить на своей домашней странице).
Я не хочу, чтобы вы зависли в telnet. Чтобы его закрыть, введите следующее:
>q
Стандартные веб-библиотеки Python
В Python 2 модули веб-клиентов и веб-серверов были слегка разбросаны. Одна из целей Python 3 заключается в том, чтобы разместить эти модули в двух пакетах (как вы помните из главы 5, пакет — это всего лишь папка для хранения файлов модулей).
• http управляет всеми деталями клиент-серверного взаимодействия HTTP:
• client выполняет всю работу на стороне клиента;
• server помогает вам написать веб-сервер;
• cookies и cookiejar управляют cookies, которые сохраняют данные между посещениями;
• urllib работает на базе http:
• request обрабатывает клиентские запросы;
• response обрабатывает ответы сервера;
• parse разбивает URL на части.
Воспользуемся стандартной библиотекой, чтобы получить что-нибудь с сайта. URL в следующем примере возвращает случайную текстовую цитату — это что-то вроде печенья с предсказанием:
>>>> import urllib.request as ur
>>>> url = 'http://www.iheartquotes.com/api/v1/random'
>>>> conn = ur.urlopen(url)
>>>> print(conn)
><http.client.HTTPResponse object at 0x1006fad50>
Из официальной документации (http://bit.ly/httpresponse-docs) мы можем узнать, что conn является объектом класса HTTPResponse, содержащим несколько методов, и его метод read() предоставит нам информацию о веб-странице:
>>>> data = conn.read()
>>>> print(data)
>b'You will be surprised by a loud noise.\r\n\n[codehappy]
>http://iheartquotes.com/fortune/show/20447\n'
Этот небольшой фрагмент кода открыл соединение TCP/IP с удаленным сервером цитат, создал запрос HTTP и получил HTTP-ответ. Ответ содержит не только данные о странице (цитату). Одна из наиболее важных частей ответа — это код статуса HTTP:
>>>> print(conn.status)
>200
Значение 200 означает, что все прошло гладко. Существуют десятки кодов статуса HTTP, объединенных в пять диапазонов в соответствии с их первой цифрой (сотни):
• 1xx (информация). Сервер получил запрос, но имеет некоторую дополнительную информацию для клиента;