Поиск по сайту:

Запрос HTTP-клиента Python — GET, POST


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

HTTP-клиент Python

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

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

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

import http.client

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

ПОЛУЧИТЬ HTTP-запрос Python

Теперь мы будем использовать 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()

Получение 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)
$ 

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

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

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

Мы также можем отправить данные по 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-запрос PUT Python

Конечно, мы также можем выполнить запрос 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 с помощью API Doc.