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())