JavaRush/Java курси/Модуль 1: Python Core/Використовуємо HttpClient

Використовуємо HttpClient

Відкрита

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. Вам потрібно знати, як з ним працювати, щоб ви могли правильно конфігурувати їх роботу.

2
Задача
Модуль 1: Python Core,  13 рівень4 лекція
Недоступна
Виконання GET-запиту з використанням http.client
Виконання GET-запиту з використанням http.client
2
Задача
Модуль 1: Python Core,  13 рівень4 лекція
Недоступна
Виконання POST-запиту з використанням http.client
Виконання POST-запиту з використанням http.client
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.