Клиентский запрос HTTP в Python – GET, POST

Модуль 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 все работало отлично.

Python HTTP Client 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