Протокол http на python

Модуль HTTP в Python

Модуль HTTP в Python определяет классы, которые обеспечивают клиентскую сторону протоколов HTTP и HTTPS. В большинстве программ модуль HTTP не используется напрямую, он объединен с модулем urllib для обработки URL-соединений и взаимодействия с HTTP-запросами. Сегодня мы узнаем, как использовать HTTP-клиент Python для запуска HTTP-запроса, а затем проанализируем статус ответа и получим данные.

В этом посте мы попробуем установить соединения и сделать HTTP-запросы, такие как GET, POST и PUT.

Создание HTTP-соединений

С помощью этого модуля мы можем легко устанавливать HTTP-соединения. Вот пример программы:

import http.client connection = http.client.HTTPConnection('www.python.org', 80, timeout=10) print(connection)

Давайте посмотрим на результат этой программы:

python http connection

В этом скрипте мы подключились к URL-адресу на порту 80 с определенным таймаутом.

GET

Теперь мы будем использовать HTTP-клиент, чтобы получить ответ и статус по URL-адресу. Давайте посмотрим на фрагмент кода:

import http.client connection = http.client.HTTPSConnection("www.journaldev.com") connection.request("GET", "/") response = connection.getresponse() print("Status: <> and reason: <>".format(response.status, response.reason)) connection.close()

В приведенном выше сценарии мы использовали URL-адрес и проверили статус с помощью объекта подключения. Давайте посмотрим на результат этой программы.

Не забудьте закрыть соединение, как только вы закончите работу с объектом. Также обратите внимание, что мы использовали HTTPSConnection для установления соединения, поскольку веб-сайт обслуживается по протоколу HTTPS.

Получение SSL: ошибка CERTIFICATE_VERIFY_FAILED

Когда я впервые выполнил указанную выше программу, я получил следующую ошибку, связанную с сертификатами SSL.

$ python3.6 http_client.py Traceback (most recent call last): File "http_client.py", line 4, in connection.request("GET", "/") File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1239, in request self._send_request(method, url, body, headers, encode_chunked) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1285, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1234, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1026, in _send_output self.send(msg) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 964, in send self.connect() File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1400, in connect server_hostname=server_hostname) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 401, in wrap_socket context=self, session=session) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 808, in init self.do_handshake() File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 1061, in do_handshake self._sslobj.do_handshake() File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 683, in do_handshake self._sslobj.do_handshake() ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748) $

Из вывода было ясно, что он должен что-то делать с сертификатами SSL. Но сертификат веб-сайта в порядке, так что это должно быть что-то с настройкой. После некоторого поиска в Google я обнаружил, что в MacOS нам нужно запустить файл Install Certificates.command, находящийся в каталоге установки в Python, чтобы исправить эту проблему. На изображении ниже показан результат выполнения этой команды, похоже, что он устанавливает последние сертификаты, которые будут использоваться при создании SSL-соединений.

Ошибка ssl CERTIFICATE_VERIFY_FAILED в python

Обратите внимание, что я получил эту ошибку в Mac OS. Однако в моей системе Ubuntu он работал отлично.

HTTP Клиент Ubuntu в Python

Получение списка заголовков из ответа

Заголовки получаемого из ответа обычно также содержат важную информацию о типе данных, отправляемых обратно с сервера, а также о статусе ответа. Мы можем получить список заголовков из самого объекта ответа. Давайте посмотрим на фрагмент кода, который представляет собой немного измененную версию последней программы:

import http.client import pprint connection = http.client.HTTPSConnection("www.journaldev.com") connection.request("GET", "/") response = connection.getresponse() headers = response.getheaders() pp = pprint.PrettyPrinter(indent=4) pp.pprint("Headers: <>".format(headers))

Посмотрим на результат этой программы:

Заголовки http-запросов в python

Запрос POST

Мы также можем отправить данные POST в URL-адрес с помощью модуля HTTP и получить ответ. Вот пример программы:

import http.client import json conn = http.client.HTTPSConnection('www.httpbin.org') headers = foo = json_data = json.dumps(foo) conn.request('POST', '/post', json_data, headers) response = conn.getresponse() print(response.read().decode())

Давайте посмотрим на результат этой программы:

http post

Не бойтесь использовать библиотеку HTTP Bin, чтобы попробовать больше запросов.

HTTP-запрос PUT

Конечно, мы также можем выполнить запрос PUT, используя сам модуль HTTP. Воспользуемся самой последней программой. Давайте посмотрим на фрагмент кода:

import http.client import json conn = http.client.HTTPSConnection('www.httpbin.org') headers = foo = json_data = json.dumps(foo) conn.request("PUT", "/put", json_data) response = conn.getresponse() print(response.status, response.reason)

Посмотрим на результат этой программы:

Запрос по протоколу HTTP

Заключение

В этом уроке мы изучили простые операции HTTP, которые можно выполнить с помощью http.client. Мы также можем создать http-сервер на Python, используя модуль SimpleHTTPServer.

Источник

http — HTTP modules¶

http is a package that collects several modules for working with the HyperText Transfer Protocol:

  • http.client is a low-level HTTP protocol client; for high-level URL opening use urllib.request
  • http.server contains basic HTTP server classes based on socketserver
  • http.cookies has utilities for implementing state management with cookies
  • http.cookiejar provides persistence of cookies

The http module also defines the following enums that help you work with http related code:

A subclass of enum.IntEnum that defines a set of HTTP status codes, reason phrases and long descriptions written in English.

>>> from http import HTTPStatus >>> HTTPStatus.OK HTTPStatus.OK >>> HTTPStatus.OK == 200 True >>> HTTPStatus.OK.value 200 >>> HTTPStatus.OK.phrase 'OK' >>> HTTPStatus.OK.description 'Request fulfilled, document follows' >>> list(HTTPStatus) [HTTPStatus.CONTINUE, HTTPStatus.SWITCHING_PROTOCOLS, . ] 

Источник

Читайте также:  Save html table to pdf
Оцените статью