5.1 Знайомство з HttpClient
В Python, як і в багатьох мовах програмування, є стандартний
HttpClient. В Python він називається http.client
і дозволяє
виконувати низькорівневі HTTP-запити і працювати з HTTP-відповідями. Він
дозволяє створювати підключення до HTTP-серверів і взаємодіяти
з ними.
Низькорівневий модуль, такий як http.client
, надає більш детальний контроль над HTTP-операціями,
але вимагає більше коду для виконання завдань. На відміну від нього, високорівневі модулі, як requests
,
надають більш простий інтерфейс, приховуючи багато деталей реалізації.
Основні можливості http.client
Модуль http.client
надає наступні основні
можливості:
- Створення HTTP-підключень.
- Відправка HTTP-запитів.
- Читання HTTP-відповідей.
- Обробка заголовків і тіла запитів і відповідей.
На відміну від модуля requests, модуль http.client
більш
низькорівневий і там приділено велике значення нюансам роботи
http-запиту.
Основні класи і методи http.client
Клас/Метод | Опис |
---|---|
HTTPConnection |
Створення HTTP-підключення. |
HTTPSConnection |
Створення HTTPS-підключення. |
request(method, url, ...) |
Відправка HTTP-запиту. |
getresponse() |
Отримання відповіді на запит. |
response.status |
Статус-код відповіді. |
response.reason |
Текстовий опис статусу відповіді. |
response.read() |
Читання даних відповіді. |
response.getheaders() |
Отримання всіх заголовків відповіді. |
response.getheader(name) |
Отримання значення конкретного заголовку. |
Нижче ми розглянемо деякі з них детальніше.
5.2. Виконання GET-запиту
Щоб виконувати запити з використанням бібліотеки http.client
,
треба виконати такий порядок дій:
Встановити з'єднання
Відправити запит
Отримати відповідь
Закрити з'єднання
Важливо зазначити, що закриття з'єднання після використання необхідне для звільнення ресурсів і запобігання витокам пам'яті. Це особливо важливо при роботі з великою кількістю запитів або в довгоживучих додатках.
Приклад використання HTTPConnection
для звичайного HTTP-запиту:
import http.client
# Створення HTTP-підключення
conn = http.client.HTTPConnection("example.com")
# Відправка GET-запиту
conn.request("GET", "/")
# Отримання відповіді
response = conn.getresponse()
print(response.status, response.reason)
# Закриття підключення
conn.close()
Приклад використання HTTPSConnection
:
import http.client
# Створення підключення
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Відправка GET-запиту
conn.request("GET", "/posts/1")
# Отримання відповіді
response = conn.getresponse()
print(response.status, response.reason)
# Читання і декодування даних відповіді
data = response.read().decode('utf-8')
print(data)
# Отримання всіх заголовків відповіді
headers = response.getheaders()
for header in headers:
print(f"{header[0]}: {header[1]}")
# Закриття підключення
conn.close()
Трохи довше, ніж при використанні requests
, так?
5.3 Виконання POST-запиту
POST-запит
з використанням http.client
виконується дуже схоже на
GET-запит
, тільки дані потрібно упаковувати в json-строку
самостійно, а також потрібно вручну вказати тип передаваних
даних — додати заголовок Content-Type
.
Приклад:
import http.client
import json
# Відправка POST-запиту
conn.request("POST", "/posts", body=payload, headers=headers)
В якості body
потрібно передати json-об'єкт
, серіалізований у строку,
а в якості headers
— словник, що містить інформацію про тип даних.
Вони можуть виглядати, наприклад, так:
# Дані для відправки
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# Заголовки – тип переданого контенту
headers = {
'Content-Type': 'application/json'
}
Тоді повний код POST-запиту
буде виглядати так:
import http.client
import json
# Дані для відправки
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# Заголовки
headers = {
'Content-Type': 'application/json'
}
# Створення підключення
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Відправка POST-запиту
conn.request("POST", "/posts", body=payload, headers=headers)
# Отримання відповіді
response = conn.getresponse()
print(response.status, response.reason)
# Читання і декодування даних відповіді
data = response.read().decode('utf-8')
print(data)
# Закриття підключення
conn.close()
5.4 Обробка помилок при виконанні запитів
Також думаю, буде корисно навести приклад обробки помилок, адже він
відрізняється від поведінки requests. У модулі http.client
виняток
кидається автоматично
, якщо були
проблеми з підключенням або інші HTTP-помилки.
Приклад:
import http.client
try:
# Створення підключення
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Відправка GET-запиту
conn.request("GET", "/posts/1")
# Отримання відповіді
response = conn.getresponse()
print(response.status, response.reason)
# Читання і декодування даних відповіді
data = response.read().decode('utf-8')
print(data)
except http.client.HTTPException as e:
print("HTTP error occurred:", e)
except Exception as e:
print("An error occurred:", e)
finally:
# Закриття підключення
conn.close()
Що сказати? Використання модуля requests буде, звичайно, простіше. Але! Багато модулів і фреймворків використовують під капотом саме низькорівневий http.client. Вам потрібно знати, як з ним працювати, щоб ви могли правильно конфігурувати їх роботу.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ