4.1 Обробка відповідей
Модуль requests надає зручні методи для роботи з відповідями сервера.
Статус-коди
Крім відповіді, сервер ще надсилає статус обробки запиту. Інформація про статус міститься в полях status_code і reason. Приклад нижче:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # Виводить статус-код відповіді
print(response.reason) # Виводить текстовий опис статусу
print(response.ok) # Повертає True, якщо статус-код менше 400
Заголовки
Ну і звісно, який HTTP-запит без заголовків? Якщо вам потрібні заголовки запиту або заголовки відповіді, то до них можна звернутись через поле headers:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # Виводить заголовки відповіді
print(response.headers['Content-Type']) # Виводить значення конкретного заголовка
Тіло відповіді
Відповідь сервера може містити набір байтів, текст, json або xml. Якщо ви знаєте, що саме ви запитуєте у сервера, то можете одразу отримати об'єкт потрібного типу, скориставшись одним з методів/полів:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # Виводить тіло відповіді у вигляді тексту
print(response.json()) # Виводить тіло відповіді у вигляді JSON
print(response.content) # Виводить тіло відповіді у вигляді байтів
Детальніше про заголовки (headers) і статуси відповіді ви дізнаєтеся в лекціях про пристрій мережі.
4.2 Обробка помилок
Модуль requests надає винятки для обробки помилок.
HTTP-стандарт не передбачає винятків, замість цього він працює з кодами помилок (status_code). Якщо ви хочете, щоб у результаті невдалого запиту було згенеровано виняток Python, вам потрібно явно викликати функцію raise_for_status().
Приклад:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # Генерує виняток для статус-кодів 4xx і 5xx
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except Exception as err:
print(f"Other error occurred: {err}")
else:
print("Success!")
Детальніше про коди помилок ви можете дізнатися з лекцій про пристрій мережі.
4.3 Відправка даних
До винаходу JSON великі обсяги даних відправлялись за допомогою «форми». Форма – це спеціальний об'єкт сторінки браузера (і стандарт даних в HTTP). Якщо ви хочете відправити дані «з допомогою форми», то вам потрібно просто разом з запитом передати параметр data.
Важливо! GET-запити не підтримують форми, оскільки не містять тіла запиту. Всі їх дані передаються тільки в URL.
Відправка даних в GET-запиті
В GET-запиті дані передаються через параметри URL. Ось приклад:
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # Виведе URL з доданими параметрами
Відправка даних форми
Ми скористаємося POST-запитом, щоб відправити дані на сервер.
Приклад:
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
Відправка файлів
Якщо ви хочете відправити в інтернет бінарні дані, наприклад, завантажити картинку, то для цього вам потрібно передати ваш файл або файли в запит за допомогою параметра files.
Приклад:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
Просто як двічі два. Якщо ви хочете відправити декілька файлів, то перерахуйте їх під будь-якими іменами в змінній files.
Важливо! Не забувайте закривати файл після відправки, щоб уникнути витоку ресурсів. Найкраще використовувати конструкцію with, яка автоматично закриє файл після завершення операції:
import requests
with open('example.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
4.4 Логін і авторизація
API (Application Programming Interface) – це набір правил і протоколів, які дозволяють різним програмам взаємодіяти один з одним. Дуже багато сайтів і сервісів дозволяють відправляти їм запити і працювати з їх API тільки після логіна.
Після успішного логіна ви отримуєте спеціальний об'єкт – сесію (session), який містить унікальний номер вашої «авторизованої сесії з сервером». Для подальших запитів вам потрібно буде використовувати цей об'єкт.
Аутентифікація
Для того, щоб залогінитися на сервер, потрібно пройти аутентифікацію (процес логіна), для чого вам потрібно передати з запитом облікові дані.
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', \
auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
Так виглядає процес авторизації, але зазвичай його використовують разом з сесією.
Використання сесій
Сесії дозволяють зберігати параметри між запитами, такі як cookies або інформація про авторизацію користувача.
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# Створення сесії
session = requests.Session()
# Логін на сайт
login_response = session.post('https://example.com/login', data = payload)
# Подальша робота під сесією залогіненого користувача
data_response = session.get('https://example.com/api/data')
print(data_response.json())
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ