Python · API · Початковий рівень

Заголовки та Echo-ендпоінт

5 завдань

Додавайте власні HTTP-заголовки до запитів і використовуйте echo-ендпоінт для перевірки надісланих даних.

HTTP-заголовки

#
Кожен HTTP-запит несе метадані разом із тілом: це заголовки. Вони повідомляють серверу такі речі: який формат відповіді ви очікуєте, хто ви і як інтерпретувати тіло запиту. Щоб надіслати власні заголовки через requests, передайте dict як аргумент headers: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' headers = { 'Accept': 'application/json', 'User-Agent': 'MyScript/1.0', } response = requests.get(f'{BASE_URL}/api/products/', headers=headers) ``` Кілька заголовків, що часто зустрічаються: - User-Agent — ідентифікує ваш клієнт. Сервери іноді логують це або блокують невідомих агентів. requests надсилає за замовчуванням щось на зразок 'python-requests/2.x.x'. - Accept — повідомляє серверу, який формат ви хочете отримати. Для JSON API це зазвичай 'application/json', хоча сервер часто ігнорує це і повертає JSON незалежно від значення. - Content-Type — описує формат тіла, яке ви надсилаєте (для POST/PUT/PATCH). requests встановлює це автоматично, коли використовуєте json=. - Authorization — передає облікові дані для автентифікації. Розглядається в темах про авторизацію. Ви також можете читати заголовки, надіслані сервером у відповіді: ```python response = requests.get(f'{BASE_URL}/api/products/') print(response.headers['Content-Type']) # application/json print(response.headers.get('X-Custom', '')) # '' якщо немає ``` response.headers нечутливий до регістру — 'content-type' і 'Content-Type' повертають однакове значення.

Використання echo-ендпоінта

#
Ендпоінт echo відображає ваш запит у вигляді JSON. Він призначений для налагодження — ви можете побачити саме те, що отримав сервер: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' response = requests.get(f'{BASE_URL}/api/echo/') print(response.json()) ``` Відповідь містить метод, шлях, заголовки та тіло, які отримав сервер. Тепер додайте власний заголовок і подивіться, як він з'явиться: ```python headers = {'X-My-Header': 'hello', 'User-Agent': 'MyBot/1.0'} response = requests.get(f'{BASE_URL}/api/echo/', headers=headers) data = response.json() print(data['headers']['X-My-Header']) # 'hello' print(data['headers']['User-Agent']) # 'MyBot/1.0' ``` Надішліть POST із JSON-тілом та перевірте його: ```python payload = {'action': 'test', 'value': 42} response = requests.post(f'{BASE_URL}/api/echo/', json=payload) data = response.json() print(data['method']) # 'POST' print(data['body']) # пейлоад, який ви надіслали ``` Коли використовуєте json=, requests автоматично встановлює Content-Type на application/json і серіалізує dict. Це можна підтвердити через echo: ```python print(data['headers']['Content-Type']) # application/json ``` Ендпоінт echo також приймає довільні шляхи, що корисно для тестування поведінки різних форм URL: ```python response = requests.get(f'{BASE_URL}/api/echo/debug/anything/you/want/') print(response.json()['path']) # '/api/echo/debug/anything/you/want/' ```

Довідник заголовків та echo

#
Ендпоінти echo: ``` GET/POST/PUT/PATCH/DELETE /api/echo/ Відображення будь-якого запиту GET/POST/PUT/PATCH/DELETE /api/echo/{path} Відображення з довільним шляхом ``` Форма відповіді echo: ```json { "method": "POST", "path": "/api/echo/", "headers": { "Content-Type": "application/json", ... }, "body": { ... }, "query_params": { ... } } ``` Поширені заголовки запиту: ``` User-Agent Ідентифікує ваш клієнт Accept Очікуваний формат відповіді (application/json) Content-Type Формат тіла запиту (встановлюється автоматично при json=) Authorization Облікові дані (Token ..., Bearer ...) ``` Надсилання заголовків: ```python requests.get(url, headers={'X-Custom': 'value'}) requests.post(url, json=payload) # Content-Type встановлюється автоматично ``` Читання заголовків відповіді: ```python response.headers['Content-Type'] # прямий доступ response.headers.get('X-Custom', '') # безпечний доступ зі значенням за замовчуванням ```
01

Огляд відповіді echo

#

Надішліть GET-запит до /api/echo/ та виведіть повну JSON-відповідь. Зверніть увагу, які заголовки сервер отримав від вашого запиту за замовчуванням.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Надішліть GET до /api/echo/ і виведіть JSON відповіді
Рішення
import requests
import json

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/echo/')
print(json.dumps(response.json(), indent=2))
02

Надіслати власний заголовок

#

Надішліть GET до /api/echo/ з власним заголовком X-Client-Name зі значенням "my-script". Підтвердіть, що він з'явився у відповіді echo, вивівши його значення з відповіді.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Додайте заголовок X-Client-Name і перевірте його у відповіді echo
Рішення
import requests

BASE_URL = 'https://apilearn.tukas.dev'

headers = {'X-Client-Name': 'my-script'}
response = requests.get(f'{BASE_URL}/api/echo/', headers=headers)
data = response.json()
print(data['headers']['X-Client-Name'])
03

Змінити User-Agent

#

Надішліть запит до /api/echo/ з User-Agent "DataCollector/2.0". Виведіть значення User-Agent з відповіді echo для підтвердження, що його отримано.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Встановіть User-Agent і перевірте через echo
Рішення
import requests

BASE_URL = 'https://apilearn.tukas.dev'

headers = {'User-Agent': 'DataCollector/2.0'}
response = requests.get(f'{BASE_URL}/api/echo/', headers=headers)
print(response.json()['headers']['User-Agent'])
04

POST із JSON-тілом

#

Надішліть POST до /api/echo/ з JSON-тілом, що містить ключі "name" і "value". Виведіть поля method і body з відповіді echo.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

payload = {'name': 'test', 'value': 99}

# POST до /api/echo/ і виведіть method і body з відповіді
Рішення
import requests

BASE_URL = 'https://apilearn.tukas.dev'

payload = {'name': 'test', 'value': 99}
response = requests.post(f'{BASE_URL}/api/echo/', json=payload)
data = response.json()
print(data['method'])
print(data['body'])
05

Читання заголовків відповіді

#

Зробіть GET /api/products/ та виведіть Content-Type і будь-який заголовок, що містить "Allow" у назві. Якщо "Allow" відсутній — виведіть "Не знайдено".

import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')

# Виведіть Content-Type і знайдіть заголовок Allow
Рішення
import requests

BASE_URL = 'https://apilearn.tukas.dev'

response = requests.get(f'{BASE_URL}/api/products/')

print(response.headers['Content-Type'])

allow = response.headers.get('Allow', 'Не знайдено')
print(allow)