Модуль Python HTTP определяет классы, которые предоставляют клиентскую часть протоколов HTTP и HTTPS. В большинстве программ модуль HTTP не используется напрямую и объединяется с модулем urllib
для обработки подключений к URL и взаимодействия с HTTP-запросами. Сегодня мы узнаем, как использовать клиент HTTP на Python для отправки HTTP-запроса, а затем разбора статуса ответа и получения данных тела ответа.
Python HTTP клиент
В этой статье о модуле Python HTTP мы попробуем установить соединение и выполнить HTTP-запросы, такие как GET, POST и PUT. Начнем.
Установка HTTP-соединений
Мы начнем с самого простого – установки HTTP-соединений с помощью этого модуля. Вот пример программы:
import http.client
connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)
Давайте посмотрим на вывод этой программы: В этом скрипте мы подключились к URL на порту 80 с заданным таймаутом.
Python HTTP 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 <module>
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-сертификатами. Но сертификат веб-сайта в порядке, так что проблема должна быть с моей конфигурацией. После некоторого поиска в Гугле я обнаружил, что на MacOS нам нужно запустить файл Install Certificates.command
, находящийся в каталоге установки Python, чтобы исправить эту проблему. На рисунке ниже показан результат выполнения этой команды, похоже, что она устанавливает последние сертификаты, которые будут использоваться при установлении SSL-соединений. Обратите внимание, что я получил эту ошибку на Mac OS. Однако на моей системе Ubuntu все работало отлично.

Получение списка заголовков из ответа
Из полученного ответа заголовки обычно также содержат важную информацию о типе данных, отправленных с сервера, и статусе ответа. Мы можем получить список заголовков из самого объекта ответа. Давайте рассмотрим фрагмент кода, который является немного измененной версией предыдущей программы:
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))
Давайте посмотрим на вывод этой программы:
Python HTTP POST
Мы также можем отправлять данные на URL с использованием модуля HTTP и получать ответ. Вот пример программы:
import http.client
import json
conn = http.client.HTTPSConnection('www.httpbin.org')
headers = {'Content-type': 'application/json'}
foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)
conn.request('POST', '/post', json_data, headers)
response = conn.getresponse()
print(response.read().decode())
Давайте посмотрим на вывод этой программы: Не стесняйтесь использовать библиотеку HTTP Bin для тестирования других запросов.
Python HTTP PUT запрос
Конечно, мы также можем выполнить запрос PUT с использованием самого модуля HTTP. Мы будем использовать последнюю программу. Давайте посмотрим на отрывок кода:
import http.client
import json
conn = http.client.HTTPSConnection('www.httpbin.org')
headers = {'Content-type': 'application/json'}
foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)
conn.request("PUT", "/put", json_data)
response = conn.getresponse()
print(response.status, response.reason)
Давайте посмотрим на вывод этой программы:
Вывод
В этом уроке мы изучили простые операции HTTP, которые можно выполнить с помощью http.client
. Мы также можем создавать серверы HTTP на Python с использованием модуля SimpleHTTPServer. Ссылка: Документация по API
Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post